From e34602326494d7ea23102dce20e5395d14a33226 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@gmail.com> Date: Mon, 13 May 2024 17:51:04 +0200 Subject: [PATCH 01/78] setup project (react & bootstrap & openAPI & eslint) --- react-ui/.gitignore | 26 + react-ui/README.md | 11 + react-ui/eslint.config.js | 40 + react-ui/package.json | 47 + react-ui/public/favicon.ico | Bin 0 -> 3870 bytes react-ui/public/index.html | 43 + react-ui/public/logo192.png | Bin 0 -> 5347 bytes react-ui/public/logo512.png | Bin 0 -> 9664 bytes react-ui/public/manifest.json | 25 + react-ui/public/robots.txt | 3 + react-ui/scripts/build-api.sh | 10 + react-ui/src/App.css | 40 + react-ui/src/App.js | 27 + react-ui/src/App.test.js | 9 + react-ui/src/index.css | 13 + react-ui/src/index.js | 18 + react-ui/src/logo.svg | 1 + react-ui/src/reportWebVitals.js | 13 + react-ui/src/setupTests.js | 5 + react-ui/yarn.lock | 10081 ++++++++++++++++++++++++++++++ 20 files changed, 10412 insertions(+) create mode 100644 react-ui/.gitignore create mode 100644 react-ui/README.md create mode 100644 react-ui/eslint.config.js create mode 100644 react-ui/package.json create mode 100644 react-ui/public/favicon.ico create mode 100644 react-ui/public/index.html create mode 100644 react-ui/public/logo192.png create mode 100644 react-ui/public/logo512.png create mode 100644 react-ui/public/manifest.json create mode 100644 react-ui/public/robots.txt create mode 100755 react-ui/scripts/build-api.sh create mode 100644 react-ui/src/App.css create mode 100644 react-ui/src/App.js create mode 100644 react-ui/src/App.test.js create mode 100644 react-ui/src/index.css create mode 100644 react-ui/src/index.js create mode 100644 react-ui/src/logo.svg create mode 100644 react-ui/src/reportWebVitals.js create mode 100644 react-ui/src/setupTests.js create mode 100644 react-ui/yarn.lock diff --git a/react-ui/.gitignore b/react-ui/.gitignore new file mode 100644 index 000000000..bccd6e591 --- /dev/null +++ b/react-ui/.gitignore @@ -0,0 +1,26 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# api +/src/api + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/react-ui/README.md b/react-ui/README.md new file mode 100644 index 000000000..6426c57c6 --- /dev/null +++ b/react-ui/README.md @@ -0,0 +1,11 @@ +# React - UI +This is the UI for the goSDN project. It's a webapp written in rust + +### Getting started + + +### Requirements +- Docker + +### Author +Matthias Feyll \ No newline at end of file diff --git a/react-ui/eslint.config.js b/react-ui/eslint.config.js new file mode 100644 index 000000000..d48899f21 --- /dev/null +++ b/react-ui/eslint.config.js @@ -0,0 +1,40 @@ +const react = require("eslint-plugin-react"); +const globals = require("globals"); +const jest = require("eslint-plugin-jest"); + +const reactRecommended = require("eslint-plugin-react/configs/recommended"); + +module.exports = [ + { + files: ["**/*.{js,jsx,mjs,cjs,ts,tsx}"], + ignores: ["src/api/**/*", "eslint.config.js"], + + rules: { + ...reactRecommended.rules, + "no-unused-vars": "warn", + "no-undef": "warn", + "max-len": ["warn", { "comments": 65 }] + }, + + plugins: { + jest, + react, + }, + + languageOptions: { + ...reactRecommended.languageOptions, + globals: { + ...globals.browser, + test: true, + expect: true, + }, + }, + settings: { + react: { + pragma: "React", // Pragma to use, default to "React" + version: "detect", // React version. "detect" automatically picks the version you have installed. + flowVersion: "0.53", // Flow version + }, + }, + }, +]; diff --git a/react-ui/package.json b/react-ui/package.json new file mode 100644 index 000000000..13c386f25 --- /dev/null +++ b/react-ui/package.json @@ -0,0 +1,47 @@ +{ + "name": "react-ui", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "bootstrap": "^5.3.3", + "react": "^18.3.1", + "react-bootstrap": "^2.10.2", + "react-dom": "^18.3.1", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "build::api": "./scripts/build-api.sh" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "eslint": "^8.0.0", + "eslint-plugin-jest": "^28.5.0", + "eslint-plugin-react": "^7.34.1", + "globals": "^15.2.0" + } +} diff --git a/react-ui/public/favicon.ico b/react-ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 zcmZQzU}Run5D);-3Ji}K85rCc7#JiZAbcKX1_n(g1_lKM2;Y*Kfx(oOfx*E6!r#Eg zz>vqmz|a}s=g!L|#l^tD!0YMZ62!p3AOOM~%nS?+8oK<!3=9lU0(?STl`w!&K!j~k zgQmH)mX)2ygeAI8?yeoPEK>4KBa+ObQ@v-d^PaWd&^OdFz1TQ7#&hy=tMn3e17nBk z?y#L#LbjZDtnCfkea)e=(<~;<W70BRXHU;5D_lEfYg;>*$7h<yXSsFF^_sTYd-ev8 z35#`|JQ8pH)^TuiZl2;Zce9$FLHORAev5Z`PF|s+sqNG_(QE3ep!Fy0%i8RU8|_M4 zf;XPBEvye%c`#tbfq>=vb?jYCLgQ4mb$u6X^PaIzRa?i%KSJBa(Pz#kWi>UIwi&8A zdY)5PmVF8N#=yY9S`y?J?D_1u*OSx(smmA`7*=|^IEGX(`u1&&a&_cs`G0dW=eu{R zK?~pCe;5*yaooLix6Z+JM{SumiCwCHm-{yDZEjxLB*$qgkJ{}NnU|&S`r?tkcY^Ev z{yST1nK;?*?*7}pYfrX7itw-H>%H;?r_VfR{LDwmYv+R5XRiJUY*%^o{Ky{pw6v`{ zFB?oVEtw?G%wO-ZLPkH=iK(r<{Op}_YZu-d+G<VVt3_AsT;cL1U&P_mmLSiS7n~O6 z=Su0Z-`>oAfPsO5!PC{xWt~$(6P75J0HqXg6klI?_7npHV=DG2hQzs1P?X=IonF&c z8wW*uO<$vFY8iR(o`H9;Nq9ow>LWgLHmPds8h8b1nps(;mpC^~R#H~BFKY|ke$l?X z%_gr}O;<ni(0$v&daKM*r}_zwwY`qjJx+}i^*sXumhZPMZ1A4BF8<1ApShb=G&HSq zs)E*^OuY5mbMlI)V~>qP;|zU6jYDFijz037ygXw69k=dzx=!u^D-M`Nr|LMknntDg zFW;~0<Pov|wzjQf_`X{@4sPLlZUnA6Y+u$IzUR8OjiW<lhmx{N%$Zjv;fXP4UI%YF zqoSdu=js!8@nhJot7fqo$||bveG8S<)UC71!**WLb@ud`y)o*@!?+9YL1}5jDSZz= z-v!&_uYQd={nB^AHj9*em)7YnZ8Pjjnze16qE9^2v2(U7X|l<$b*St#@Cnv)^$yu` zPDNcqRY%XUt}lG=P3Oi*s@gg+r(QTKK9OZ$U|<KOF}8_s-%aS~oa4Ul8Uq8PKO~jq zbRKrv7AVp>zjVv}_!FCLPKzzOTPBm*`-*K-@8?7@Gcm_=`+CG#ewQt(W_LKp&fu!f za4&_y^Qz)=nR#!e6c|1@Prnk<&HXQ(L59KbkgLXdR*{dvfyGjfGI@{mw?_TnE*8eN zlbeC*g67L~#m-e3=Y9$>m9W0trJGqhW2@j+o2&Ms+xl~yq7sj6F{yUB{HSMle5%FL z%Hxe|56BzO)11H5enXnIh2CSCB_(HUpIY;AT0J&3N~`yddQ+bx^mE0HS!XTv<|#K{ zVsboKc;?q_F*f;ii^KjmCfG7FtE@R>AHQwiI@T+NzRxG<z4ub#=dzD0{QmLn?f&<A zwK`32il5!(;fW6^DY>$bLDW#0y;EP~&2-&pHlfBB35_oj&am8ifAm9?e2VF$zL~S_ z&!r|s?Z4NNsdxL?OdbKrH-+a~v<){f)*k9H{mH=a{&~s@_o?T95XcJ(3=9kk;Jo0n zr0W<11EV7-FEB7LKoUPz(kLh@Y}d8;D_=slU$iZ1P|?s-H!_Vq_tv?2s)0|iO@3{} zfjbfVZyR_8+7{Hgv`n+fs}9?B)wO-5MM{4BmCvpnv)sDpc}!etnNkpc^{dB(C7zR4 zxb@68i%w0r_C4YH51+Z4_1%5rFMkT%aarBKC}8D5P-a<mC}RH|HGM<toJ!-M=!6?T z-1`=WY(5)v=2haY--iC-O3KQCtB)k!{1vqBxNTuW!nJRDu0Gnfjv-qw=sJ6P&se9d zrtaJ{Iqt%H&nYX^^bAZw<KixUaH#BvI{rjOLo52^^SFy2b?jY&)}K^TRx$JoGxQB{ zX`OCY+G3qu;oiF-X#EL&4?i_seTT|UP%&H5<WSWWd-hGhiUTU@8ZK?qW6!^{$*VE& z3JTqRiSK&M9tH*mPEa~$P+j{`{rzW+PjwgXzF=TroCitiy_1<|IU9<&#oyiUn|phk z$+q0;|J*Z{<h4D2c$sq@i=)c42ka_I6BRsCf3VIB5qKPa<WNTa)L9u@tO81+cmr1( zIOrub+)FT-sT(GpusQ0DTDxOEqw>L*N!fRgJpTCWhMk_e`VZy=7H1U>w;Sg<Cu&G+ ztWYwG5O~OvEHowL)=Qt|4xUm!ty36Mba&S53(#RaF~xFW(AulgXVZ*D7VUT28<y+K z{WfCxt+!_-pNl(0&M-gsb=OtDHMT-x(|P)yo;bCtl(+WUn$_A9Q`-|W3l)}JGdF8o z`*!YK+YH{{QE%S9lgVM6E&aN^_TdV)QyZ5?yRG)LbljP3$+q;`Ywjl^J;sX;TMD0B z_<3Gqp;O(Bhe<mQKMjrF5!Zi*A)0;r7ryegztvUk>}BoJRqZ!5x)y`bzuD|<U1^^R zr<`=3cJh7p$0_HZcSY_K`@bsf$*1FW53ICIE(gZ=+s&W2pnZ=`{q@Pe!WX|h8&$)8 zuluO^<d0L|XN6pO@;Hxw%HG}li`FHmczn?QwBOzT<L?hzFDkmH{$N}hp;f~)MI!D$ zD}M?<fsEt8z`)=D&Ny?oH@;zDV6q~daj@nlJc6p)x(=0{;d`zpT>lYw@ni6&GtNzu zb?ltAENmhU-c7vqJMrdE-}zg$Z5$JC{)#woM_E-hWa|Z=d0T7?>+MQgyk~Dnxc1Gl zw%2F&MvIhu+oA?lZ5@Zoj<^f&gEyVlG_|xXYzSC+Fm(GRC1sU>Rfl3uy)f_!3|w_s zNm)5``$c6nwfHMv>`I#KiW?Jd{D{Bu*)%fQ&_CQXD#g$*OxxDU&^J`u+CkslH|ESM zEo*z@;22E{8>678_^V&FZ5?CJzteGW({XTB)73Zd4mMBB@n5#jGNr&GG1sZC-?d{_ zz={KYi*~9T7#WAe#-4j?U(s$H8t2?R)hs4GbjM{iJp-4PY3A{nL2HkBOkC<YWrgp8 zZ7LdC_GPV6#~w%QzoYBuuB@UOee$_Qa(?uQXOLP(-N@9wtj!`RPgP6XXU-<S#k-6G zA~emdZ42r&OfBLreF|8<-y}RSaP^UpE$0oqf&$kZ4cT(ebMgwa*o>g{Cqp)$HSh^` z>z-?wTIkv_+qH9!WqPq&*Iei3DavZ<F{fW9T>Gx3Z)g^i=F~XRvAQQ{-SOD7Z!}EI zRdw{Vtn9QbZ7tJ^tkO%&<1$0HU9c~2i#q-!V*l;9iys2l9`%^8SkufZZ08kq17nlW zIM?=>dagctZob|#*Ev*m1z(rpV_;yA1eX|Eeb;|nW1I4K2Iua*Q?>u}|NMMqg3gU! zUk=!Y^)oQA@IXqCC8xJCIx8};TzKC#t=+liKkMULtZ|h=u~&U>KlG2if92|31HThS zXHUP~uOuzGYSkhQgD}y@8V4d(16)FM>ojuLd{%tq&2ukuv1r|vsee2#rB!dfEr0J} zV*Q@w%fA>;zv^G0Hbv&blFo$;6@A~8=Vz_`a%)>|Z|=)a$(pgbOD46S)I7F4J?*(j zM)szU=PoUHmY%-s_{>>vBrj-3G#q_Znpw#jc74_M?A04K#YF$H(z(H5cH>UgkxjhT zyOnlZZ@3=u^B?2ww1W=?kDvYhcXIH#bLY=n*xt+EXZ`HO1r3Sj?r)cuI%Qu;{e4z6 zMw->UKs)!{yNCb$ZrL2@4gA32f9csz)-Rj4R5qpW7A+~c@LD>5>fgPK=f4U2z_|O; zlVYa7f7Z<WF-0x@L!!u^#`j^Obq}^*leAx}W$~atP{G<_=|P<xOPaXTmNrh7HRQfi zv83(#@{jXbwC4P{=(zsMhYg9!92+-_ZCj??l@~BEQ+v-g=My>|$6h=+8~?D^FX`gL zro%g)vocKe=yTG#b!nNxTptaFIGc}$8=HL0*bBV&1xz`~v9xdHB2}fyK{`(?Sx=-I zrv{x)G@PKpwdj7~af_RMTe@<+PjAdUwk`MepY4^IiZA%it%^Kf`g*~E^YI7X+h>07 z_^bVizw3yjV2#+%>WMS9*za$Qcg<te)MNBI?XtwCfotWOMNu&!#VdofI5fmL*RN#t z>YB^cS}G8sFU4!(C2Tosq3L!P*R3Ym$4%PRGM9##++td|?t&P{`nIy-G^+>cI&&Aj zaB|-LPGuX%uCqViHMT#T<{<c`%QN1d*+y1mq9RXR*NF$0_a6WD<g3#}RRNy|<r^i~ z+*}O14zAE}YmnRcL(XG{s=+bljgtG1-e}QSWY8gW^oWGG`q5{M)BW@eN?RP>Mz#mA zgun6plj!%zn`ajP%p>+6E^qCz?Mt0grk^~0W6x!SWHE#9MyFm|br_fh>6TtPvNk60 z%(f>_w(Qwz7NpF3%x%_Yvr8Yh7hP>!`=)fpv)<fC9}d;eYxn$^S;wd_?dYEchx>~I z{wZx_;Ql;+4{vH_<<rHd17<yVeCpGr<qPNBy`&Qy8@g;)SgZ7^Yg1OPi(2+7|MhF> z?G;szXFfU>oR_<%`qr-U#G5VW<yw#K-g5V=MsB+Px_?ji9@xL<H)~Jyat;Z}q|IB! z3%4CrySkoz=L8k8k5wnS#JgEM>=Ms-hZyQV`(fzc)M>C!uReqQY<uKC$IIUqbLqaa zyWPEO^`eNYi{91VU-6pf_C;&<!{7Y2)ZZvO`nUhwj{k-Xy|1qy@pn)w(?9Yre)_kV zFMP*i-s<ts+^cOch1pt0gi(<#?G%r|vMrZY4=H#>Zug&Zs83!0Xl#6!^?iW@>Pl*U ZtMWJ#1p_C<F-T5Hu2|;y@Dg%;1puB)gNgtE literal 0 HcmV?d00001 diff --git a/react-ui/public/index.html b/react-ui/public/index.html new file mode 100644 index 000000000..aa069f27c --- /dev/null +++ b/react-ui/public/index.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta name="theme-color" content="#000000" /> + <meta + name="description" + content="Web site created using create-react-app" + /> + <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> + <!-- + manifest.json provides metadata used when your web app is installed on a + user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ + --> + <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> + <!-- + Notice the use of %PUBLIC_URL% in the tags above. + It will be replaced with the URL of the `public` folder during the build. + Only files inside the `public` folder can be referenced from the HTML. + + Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will + work correctly both with client-side routing and a non-root public URL. + Learn how to configure a non-root public URL by running `npm run build`. + --> + <title>React App</title> + </head> + <body> + <noscript>You need to enable JavaScript to run this app.</noscript> + <div id="root"></div> + <!-- + This HTML file is a template. + If you open it directly in the browser, you will see an empty page. + + You can add webfonts, meta tags, or analytics to this file. + The build step will place the bundled scripts into the <body> tag. + + To begin the development, run `npm start` or `yarn start`. + To create a production bundle, use `npm run build` or `yarn build`. + --> + </body> +</html> diff --git a/react-ui/public/logo192.png b/react-ui/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 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 literal 0 HcmV?d00001 diff --git a/react-ui/public/logo512.png b/react-ui/public/logo512.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e47a6545bc15971f8f63fba70e4013df88a664 GIT binary patch literal 9664 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 Q-2sVvy85}Sb4q9e0RM_kJ^%m! literal 0 HcmV?d00001 diff --git a/react-ui/public/manifest.json b/react-ui/public/manifest.json new file mode 100644 index 000000000..080d6c77a --- /dev/null +++ b/react-ui/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/react-ui/public/robots.txt b/react-ui/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/react-ui/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/react-ui/scripts/build-api.sh b/react-ui/scripts/build-api.sh new file mode 100755 index 000000000..5716ba969 --- /dev/null +++ b/react-ui/scripts/build-api.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + +PROJECT_NAME=react-ui +PROJECT_ROOT=$(git rev-parse --show-toplevel) +API_PATH=/api/openapiv2 + +OUTPUT=${PROJECT_NAME}/src/api + +docker run -it --rm \ + -v ${PROJECT_ROOT}:/local openapitools/openapi-generator-cli generate -i /local${API_PATH}/gosdn_northbound.swagger.json -g typescript -o /local/${OUTPUT} \ No newline at end of file diff --git a/react-ui/src/App.css b/react-ui/src/App.css new file mode 100644 index 000000000..bd7fb253b --- /dev/null +++ b/react-ui/src/App.css @@ -0,0 +1,40 @@ +@import 'bootstrap/dist/css/bootstrap.min.css'; + +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/react-ui/src/App.js b/react-ui/src/App.js new file mode 100644 index 000000000..09ab5e99d --- /dev/null +++ b/react-ui/src/App.js @@ -0,0 +1,27 @@ +import "./App.css"; +import logo from "./logo.svg"; + +import React from "react"; + +function App() { + return ( + <div className="App"> + <header className="App-header"> + <img src={logo} className="App-logo" alt="logo" /> + <p> + Edit <code>src/App.js</code> and save to reload. + </p> + <a + className="App-link" + href="https://reactjs.org" + target="_blank" + rel="noopener noreferrer" + > + Learn React + </a> + </header> + </div> + ); +} + +export default App; diff --git a/react-ui/src/App.test.js b/react-ui/src/App.test.js new file mode 100644 index 000000000..8ed0a9e0b --- /dev/null +++ b/react-ui/src/App.test.js @@ -0,0 +1,9 @@ +import { render, screen } from '@testing-library/react'; +import App from './App'; +import React from 'react'; + +test('renders learn react link', () => { + render(<App />); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/react-ui/src/index.css b/react-ui/src/index.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/react-ui/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/react-ui/src/index.js b/react-ui/src/index.js new file mode 100644 index 000000000..8086ab778 --- /dev/null +++ b/react-ui/src/index.js @@ -0,0 +1,18 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import "./index.css"; +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; + +const root = ReactDOM.createRoot(document.getElementById("root")); + +root.render( + <React.StrictMode> + <App /> + </React.StrictMode> +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/react-ui/src/logo.svg b/react-ui/src/logo.svg new file mode 100644 index 000000000..9dfc1c058 --- /dev/null +++ b/react-ui/src/logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg> \ No newline at end of file diff --git a/react-ui/src/reportWebVitals.js b/react-ui/src/reportWebVitals.js new file mode 100644 index 000000000..5253d3ad9 --- /dev/null +++ b/react-ui/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/react-ui/src/setupTests.js b/react-ui/src/setupTests.js new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/react-ui/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock new file mode 100644 index 000000000..6da56475a --- /dev/null +++ b/react-ui/yarn.lock @@ -0,0 +1,10081 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adobe/css-tools@^4.0.1": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.8.3": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== + +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/eslint-parser@^7.16.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" + integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + +"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" + integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.24.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" + integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + 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.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== + dependencies: + "@babel/types" "^7.24.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.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" + integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== + dependencies: + "@babel/helper-function-name" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/types" "^7.24.5" + +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" + integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.5" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.24.1" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" + integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + 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-decorators@^7.16.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" + integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-decorators" "^7.24.1" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + 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.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + 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.16.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + 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.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + 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.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" + integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz#875c25e3428d7896c87589765fc8b9d32f24bd8d" + integrity sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-import-assertions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" + integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-import-attributes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" + integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + 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.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + 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.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" + integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== + dependencies: + "@babel/helper-module-imports" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" + +"@babel/plugin-transform-block-scoped-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-block-scoping@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" + integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.5" + +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" + integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-class-static-block@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" + integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" + integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-split-export-declaration" "^7.24.5" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/template" "^7.24.0" + +"@babel/plugin-transform-destructuring@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" + integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.5" + +"@babel/plugin-transform-dotall-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-duplicate-keys@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-dynamic-import@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" + integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-export-namespace-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" + integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@^7.16.0": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc" + integrity sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-flow" "^7.24.1" + +"@babel/plugin-transform-for-of@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== + dependencies: + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-json-strings@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" + integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" + integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-modules-amd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-modules-commonjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" + integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" + integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" + integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== + dependencies: + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.5" + +"@babel/plugin-transform-object-super@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" + +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" + integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" + integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" + integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.5" + +"@babel/plugin-transform-private-methods@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" + integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-private-property-in-object@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" + integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz#d493a0918b9fdad7540f5afd9b5eb5c52500d18d" + integrity sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" + integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-react-pure-annotations@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" + integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-regenerator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" + integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + dependencies: + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-plugin-utils" "^7.24.0" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-template-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-typeof-symbol@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" + integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.5" + +"@babel/plugin-transform-typescript@^7.24.1": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz#bcba979e462120dc06a75bd34c473a04781931b8" + integrity sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/plugin-syntax-typescript" "^7.24.1" + +"@babel/plugin-transform-unicode-escapes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-property-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" + integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-sets-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" + integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" + integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== + dependencies: + "@babel/compat-data" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + "@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.24.1" + "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@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" + "@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-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.24.1" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.24.1" + "@babel/plugin-transform-block-scoped-functions" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.5" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.4" + "@babel/plugin-transform-classes" "^7.24.5" + "@babel/plugin-transform-computed-properties" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.5" + "@babel/plugin-transform-dotall-regex" "^7.24.1" + "@babel/plugin-transform-duplicate-keys" "^7.24.1" + "@babel/plugin-transform-dynamic-import" "^7.24.1" + "@babel/plugin-transform-exponentiation-operator" "^7.24.1" + "@babel/plugin-transform-export-namespace-from" "^7.24.1" + "@babel/plugin-transform-for-of" "^7.24.1" + "@babel/plugin-transform-function-name" "^7.24.1" + "@babel/plugin-transform-json-strings" "^7.24.1" + "@babel/plugin-transform-literals" "^7.24.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-member-expression-literals" "^7.24.1" + "@babel/plugin-transform-modules-amd" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-modules-systemjs" "^7.24.1" + "@babel/plugin-transform-modules-umd" "^7.24.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.5" + "@babel/plugin-transform-object-super" "^7.24.1" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.5" + "@babel/plugin-transform-private-methods" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.5" + "@babel/plugin-transform-property-literals" "^7.24.1" + "@babel/plugin-transform-regenerator" "^7.24.1" + "@babel/plugin-transform-reserved-words" "^7.24.1" + "@babel/plugin-transform-shorthand-properties" "^7.24.1" + "@babel/plugin-transform-spread" "^7.24.1" + "@babel/plugin-transform-sticky-regex" "^7.24.1" + "@babel/plugin-transform-template-literals" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.5" + "@babel/plugin-transform-unicode-escapes" "^7.24.1" + "@babel/plugin-transform-unicode-property-regex" "^7.24.1" + "@babel/plugin-transform-unicode-regex" "^7.24.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" + integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-transform-react-display-name" "^7.24.1" + "@babel/plugin-transform-react-jsx" "^7.23.4" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.24.1" + +"@babel/preset-typescript@^7.16.0": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" + integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-syntax-jsx" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-typescript" "^7.24.1" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.24.5", "@babel/traverse@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== + dependencies: + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@csstools/normalize.css@*": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.1.1.tgz#f0ad221b7280f3fc814689786fd9ee092776ef8f" + integrity sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ== + +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + 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" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + 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@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.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" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz#02338a92a92f541a5189b97e922caf3215221e49" + integrity sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g== + dependencies: + ansi-html-community "^0.0.8" + core-js-pure "^3.23.3" + error-stack-parser "^2.0.6" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@popperjs/core@^2.11.6": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@react-aria/ssr@^3.5.0": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.3.tgz#9e7d4e019965aaf86cec3da2411a392be49ac2b3" + integrity sha512-5bUZ93dmvHFcmfUcEN7qzYe8yQQ8JY+nHN6m9/iSDCQ/QmCiE0kWXYwhurjw5ch6I8WokQzx66xKIMHBAa4NNA== + dependencies: + "@swc/helpers" "^0.5.0" + +"@restart/hooks@^0.4.9": + version "0.4.16" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" + integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== + dependencies: + dequal "^2.0.3" + +"@restart/ui@^1.6.8": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.9.tgz#05ec905a56486fa39b62f29c09b3917e57acd62f" + integrity sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw== + dependencies: + "@babel/runtime" "^7.21.0" + "@popperjs/core" "^2.11.6" + "@react-aria/ssr" "^3.5.0" + "@restart/hooks" "^0.4.9" + "@types/warning" "^3.0.0" + dequal "^2.0.3" + dom-helpers "^5.2.0" + uncontrollable "^8.0.1" + warning "^4.0.3" + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rushstack/eslint-patch@^1.1.0": + version "1.10.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" + integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@swc/helpers@^0.5.0": + version "0.5.11" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7" + integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A== + dependencies: + tslib "^2.4.0" + +"@testing-library/dom@^8.5.0": + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" + integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^13.4.0": + version "13.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^13.5.0": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" + integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== + dependencies: + "@babel/runtime" "^7.12.5" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.19.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" + integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.12.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" + integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== + dependencies: + undici-types "~5.26.4" + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/prettier@^2.1.5": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/q@^1.5.1": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837" + integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw== + +"@types/qs@*": + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/react-dom@^18.0.0": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.6": + version "4.4.10" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@>=16.9.11": + version "18.3.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" + integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/semver@^7.3.12", "@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/sockjs@^0.3.33": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.9" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" + integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== + dependencies: + "@types/jest" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + +"@types/warning@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" + integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== + +"@types/ws@^8.5.5": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^16.0.0": + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" + integrity sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw== + dependencies: + "@typescript-eslint/utils" "5.62.0" + +"@typescript-eslint/parser@^5.5.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047" + integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g== + dependencies: + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d" + integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c" + integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg== + dependencies: + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@^6.0.0 || ^7.0.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd" + integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/typescript-estree" "7.8.0" + semver "^7.6.0" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91" + integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA== + dependencies: + "@typescript-eslint/types" "7.8.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + 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" + +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + dependencies: + fast-deep-equal "^3.1.3" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.4.1" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + 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.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +aria-query@^5.0.0, aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7" + integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-array-method-boxes-properly "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + is-string "^1.0.7" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.13: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== + dependencies: + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +babel-jest@^27.4.2, babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.2.3: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-asset-import@^0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" + integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.2" + +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" + integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-decorators" "^7.16.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-transform-flow-strip-types" "^7.16.0" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.4" + "@babel/preset-env" "^7.16.4" + "@babel/preset-react" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.3" + babel-plugin-macros "^3.1.0" + babel-plugin-transform-react-remove-prop-types "^0.4.24" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bfj@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + 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" + +bonjour-service@^1.0.11: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +bootstrap@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" + integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0, camelcase@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: + version "1.0.30001617" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" + integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== + +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + 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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + +classnames@^2.3.2: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +clean-css@^5.2.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + 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.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + 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.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confusing-browser-globals@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +core-js-compat@^3.31.0, core-js-compat@^3.36.1: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== + dependencies: + browserslist "^4.23.0" + +core-js-pure@^3.23.3: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.0.tgz#ce99fb4a7cec023fdbbe5b5bd1f06bbcba83316e" + integrity sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ== + +core-js@^3.19.2: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb" + integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssdb@^7.1.0: + version "7.11.2" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.11.2.tgz#127a2f5b946ee653361a5af5333ea85a39df5ae5" + integrity sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + 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.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decimal.js@^10.2.1: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + 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.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.6: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.668: + version "1.4.763" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz#64f2041ed496fd6fc710b9be806fe91da9334f91" + integrity sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.16.0: + version "5.16.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" + integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + 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.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.17.2, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + 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" + +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-module-lexer@^1.2.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.2.tgz#00b423304f2500ac59359cc9b6844951f372d497" + integrity sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.25.3: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jest@^28.5.0: + version "28.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz#b497b795de37f671eaccd38bd83030186ff5dc8d" + integrity sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ== + dependencies: + "@typescript-eslint/utils" "^6.0.0 || ^7.0.0" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +eslint-plugin-react-hooks@^4.3.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.34.1: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + +eslint-plugin-testing-library@^5.0.1: + version "5.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz#5b46cdae96d4a78918711c0b4792f90088e62d20" + integrity sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw== + dependencies: + "@typescript-eslint/utils" "^5.58.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-webpack-plugin@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== + dependencies: + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" + micromatch "^4.0.5" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + +eslint@^8.0.0, eslint@^8.3.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + 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.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + 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" + 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.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +expect@^29.0.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +express@^4.17.3: + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.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" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + 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" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.0.0: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + 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-monkey@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" + integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.3.10: + version "10.3.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.15.tgz#e72bc61bc3038c90605f5dd48543dc67aaf3b50d" + integrity sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.11.0" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + 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" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globals@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.2.0.tgz#fbcea7f8964a71d8c6e6867ddadb9788ae1083d8" + integrity sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A== + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + 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" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== + dependencies: + harmony-reflect "^1.4.6" + +ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +immer@^9.0.7: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.4, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.9.1" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" + integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@^27.4.2, jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + 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@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-watcher@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.0.2: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.4.3: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +jiti@^1.21.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + 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.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +language-subtag-registry@^0.3.20: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@^2.0.3, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0, loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + 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.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.4.5: + version "2.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" + integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1, minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" + integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.0: + version "2.2.10" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" + integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.8" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923" + integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== + dependencies: + array.prototype.reduce "^1.0.6" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + gopd "^1.0.1" + safe-array-concat "^1.1.2" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== + dependencies: + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.0, object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + 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.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + 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" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + 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.5" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + 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.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + 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.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== + dependencies: + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.0.1: + version "7.8.3" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^7.0.35: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-format@^27.0.2, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + 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" + +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== + dependencies: + core-js "^3.19.2" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" + +react-bootstrap@^2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.2.tgz#3b609eb0170e31b3d9ace297d3a016c202a42642" + integrity sha512-UvB7mRqQjivdZNxJNEA2yOQRB7L9N43nBnKc33K47+cH90/ujmnMwatTCwQLu83gLhrzAl8fsa6Lqig/KLghaA== + dependencies: + "@babel/runtime" "^7.22.5" + "@restart/hooks" "^0.4.9" + "@restart/ui" "^1.6.8" + "@types/react-transition-group" "^4.4.6" + classnames "^2.3.2" + dom-helpers "^5.2.1" + invariant "^2.2.4" + prop-types "^15.8.1" + prop-types-extra "^1.1.0" + react-transition-group "^4.4.5" + uncontrollable "^7.2.1" + warning "^4.0.3" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-is@^16.13.1, react-is@^16.3.2: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== + +react-scripts@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" + bfj "^7.0.2" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" + optionalDependencies: + fsevents "^2.3.2" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + 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" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.9: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" + integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== + +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + 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.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup@^2.43.1: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize.css@*: + version "13.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + 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-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + 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-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.1, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-loader@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-support@^0.5.6, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + 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.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^3.3.1: + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + 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.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + 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.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + 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.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tailwindcss@^3.0.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== + 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.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + 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" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: + version "5.31.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" + integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + 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.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + 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" + +uncontrollable@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + +uncontrollable@^8.0.1: + version "8.0.4" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" + integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== + +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + 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.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.13: + version "1.0.15" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" + integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.0" + +uri-js@^4.2.2, uri-js@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +warning@^4.0.0, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-vitals@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" + integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0: + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.4" + ws "^8.13.0" + +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== + dependencies: + tapable "^2.0.0" + webpack-sources "^2.2.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.64.4: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.16.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.6.2: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + 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" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +workbox-background-sync@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" + integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== + dependencies: + idb "^7.0.1" + workbox-core "6.6.1" + +workbox-broadcast-update@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" + integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== + dependencies: + workbox-core "6.6.1" + +workbox-build@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" + integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.6.1" + workbox-broadcast-update "6.6.1" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-google-analytics "6.6.1" + workbox-navigation-preload "6.6.1" + workbox-precaching "6.6.1" + workbox-range-requests "6.6.1" + workbox-recipes "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + workbox-streams "6.6.1" + workbox-sw "6.6.1" + workbox-window "6.6.1" + +workbox-cacheable-response@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" + integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== + dependencies: + workbox-core "6.6.1" + +workbox-core@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" + integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== + +workbox-expiration@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" + integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== + dependencies: + idb "^7.0.1" + workbox-core "6.6.1" + +workbox-google-analytics@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" + integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== + dependencies: + workbox-background-sync "6.6.1" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-navigation-preload@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" + integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== + dependencies: + workbox-core "6.6.1" + +workbox-precaching@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" + integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== + dependencies: + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-range-requests@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" + integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== + dependencies: + workbox-core "6.6.1" + +workbox-recipes@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" + integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== + dependencies: + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-precaching "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + +workbox-routing@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" + integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== + dependencies: + workbox-core "6.6.1" + +workbox-strategies@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" + integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== + dependencies: + workbox-core "6.6.1" + +workbox-streams@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" + integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== + dependencies: + workbox-core "6.6.1" + workbox-routing "6.6.1" + +workbox-sw@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" + integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== + +workbox-webpack-plugin@^6.4.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" + integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.6.1" + +workbox-window@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" + integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "6.6.1" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.3.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" + integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -- GitLab From f5c91d3d995e003923a68fc0e653fa5a3f0df1f9 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 27 May 2024 00:30:24 +0200 Subject: [PATCH 02/78] added vite --- react-ui/.eslintrc.cjs | 18 + react-ui/.prettierrc | 6 + react-ui/{src => assets}/logo.svg | 0 react-ui/eslint.config.js | 40 - react-ui/{public => }/index.html | 7 +- react-ui/package.json | 109 ++- react-ui/src/App.test.js | 9 - react-ui/src/index.js | 18 - react-ui/src/index.tsx | 16 + react-ui/src/{ => pages/landingpage}/App.css | 0 react-ui/src/pages/landingpage/App.test.tsx | 9 + .../src/{App.js => pages/landingpage/App.tsx} | 10 +- react-ui/src/reportWebVitals.js | 13 - react-ui/src/setupTests.js | 2 +- react-ui/src/stores/api.store.ts | 26 + .../enhancer/monitorReducer.enhancer.ts | 19 + .../stores/middleware/logger.middleware.ts | 10 + react-ui/src/stores/slices/example.reducer.ts | 13 + react-ui/tsconfig.eslint.json | 8 + react-ui/tsconfig.json | 30 + react-ui/tsconfig.node.json | 11 + react-ui/vite.config.mjs | 18 + react-ui/yarn.lock | 896 +++++++++++++++--- 23 files changed, 1022 insertions(+), 266 deletions(-) create mode 100644 react-ui/.eslintrc.cjs create mode 100644 react-ui/.prettierrc rename react-ui/{src => assets}/logo.svg (100%) delete mode 100644 react-ui/eslint.config.js rename react-ui/{public => }/index.html (88%) delete mode 100644 react-ui/src/App.test.js delete mode 100644 react-ui/src/index.js create mode 100644 react-ui/src/index.tsx rename react-ui/src/{ => pages/landingpage}/App.css (100%) create mode 100644 react-ui/src/pages/landingpage/App.test.tsx rename react-ui/src/{App.js => pages/landingpage/App.tsx} (84%) delete mode 100644 react-ui/src/reportWebVitals.js create mode 100644 react-ui/src/stores/api.store.ts create mode 100644 react-ui/src/stores/enhancer/monitorReducer.enhancer.ts create mode 100644 react-ui/src/stores/middleware/logger.middleware.ts create mode 100644 react-ui/src/stores/slices/example.reducer.ts create mode 100644 react-ui/tsconfig.eslint.json create mode 100644 react-ui/tsconfig.json create mode 100644 react-ui/tsconfig.node.json create mode 100644 react-ui/vite.config.mjs diff --git a/react-ui/.eslintrc.cjs b/react-ui/.eslintrc.cjs new file mode 100644 index 000000000..d6c953795 --- /dev/null +++ b/react-ui/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/react-ui/.prettierrc b/react-ui/.prettierrc new file mode 100644 index 000000000..ced76ac70 --- /dev/null +++ b/react-ui/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "tabWidth": 4 +} diff --git a/react-ui/src/logo.svg b/react-ui/assets/logo.svg similarity index 100% rename from react-ui/src/logo.svg rename to react-ui/assets/logo.svg diff --git a/react-ui/eslint.config.js b/react-ui/eslint.config.js deleted file mode 100644 index d48899f21..000000000 --- a/react-ui/eslint.config.js +++ /dev/null @@ -1,40 +0,0 @@ -const react = require("eslint-plugin-react"); -const globals = require("globals"); -const jest = require("eslint-plugin-jest"); - -const reactRecommended = require("eslint-plugin-react/configs/recommended"); - -module.exports = [ - { - files: ["**/*.{js,jsx,mjs,cjs,ts,tsx}"], - ignores: ["src/api/**/*", "eslint.config.js"], - - rules: { - ...reactRecommended.rules, - "no-unused-vars": "warn", - "no-undef": "warn", - "max-len": ["warn", { "comments": 65 }] - }, - - plugins: { - jest, - react, - }, - - languageOptions: { - ...reactRecommended.languageOptions, - globals: { - ...globals.browser, - test: true, - expect: true, - }, - }, - settings: { - react: { - pragma: "React", // Pragma to use, default to "React" - version: "detect", // React version. "detect" automatically picks the version you have installed. - flowVersion: "0.53", // Flow version - }, - }, - }, -]; diff --git a/react-ui/public/index.html b/react-ui/index.html similarity index 88% rename from react-ui/public/index.html rename to react-ui/index.html index aa069f27c..e444585a7 100644 --- a/react-ui/public/index.html +++ b/react-ui/index.html @@ -2,19 +2,19 @@ <html lang="en"> <head> <meta charset="utf-8" /> - <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> + <link rel="icon" href="favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="theme-color" content="#000000" /> <meta name="description" content="Web site created using create-react-app" /> - <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> + <link rel="apple-touch-icon" href="logo192.png" /> <!-- manifest.json provides metadata used when your web app is installed on a user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ --> - <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> + <link rel="manifest" href="manifest.json" /> <!-- Notice the use of %PUBLIC_URL% in the tags above. It will be replaced with the URL of the `public` folder during the build. @@ -29,6 +29,7 @@ <body> <noscript>You need to enable JavaScript to run this app.</noscript> <div id="root"></div> + <script type="module" src="/src/index.tsx"></script> <!-- This HTML file is a template. If you open it directly in the browser, you will see an empty page. diff --git a/react-ui/package.json b/react-ui/package.json index 13c386f25..13bfaba15 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -1,47 +1,66 @@ { - "name": "react-ui", - "version": "0.1.0", - "private": true, - "dependencies": { - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "bootstrap": "^5.3.3", - "react": "^18.3.1", - "react-bootstrap": "^2.10.2", - "react-dom": "^18.3.1", - "react-scripts": "5.0.1", - "web-vitals": "^2.1.4" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "build::api": "./scripts/build-api.sh" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "eslint": "^8.0.0", - "eslint-plugin-jest": "^28.5.0", - "eslint-plugin-react": "^7.34.1", - "globals": "^15.2.0" - } + "name": "react-ui", + "version": "0.1.0", + "private": true, + "dependencies": { + "@reduxjs/toolkit": "^2.2.4", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "bootstrap": "^5.3.3", + "react": "^18.3.1", + "react-bootstrap": "^2.10.2", + "react-dom": "^18.3.1", + "react-redux": "^9.1.2", + "react-scripts": "5.0.1", + "redux": "^5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "vite", + "build": "tsc && vite build", + "test": "react-scripts test", + "build::api": "./scripts/build-api.sh", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint::fix": "eslint src --ext .js,.jsx,.ts,.tsx --fix" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/runtime": "^7.21.5", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.32.2", + "prettier": "^2.0.0", + + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } } diff --git a/react-ui/src/App.test.js b/react-ui/src/App.test.js deleted file mode 100644 index 8ed0a9e0b..000000000 --- a/react-ui/src/App.test.js +++ /dev/null @@ -1,9 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; -import React from 'react'; - -test('renders learn react link', () => { - render(<App />); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/react-ui/src/index.js b/react-ui/src/index.js deleted file mode 100644 index 8086ab778..000000000 --- a/react-ui/src/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import "./index.css"; -import App from "./App"; -import reportWebVitals from "./reportWebVitals"; - -const root = ReactDOM.createRoot(document.getElementById("root")); - -root.render( - <React.StrictMode> - <App /> - </React.StrictMode> -); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -reportWebVitals(); diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx new file mode 100644 index 000000000..4d179a46b --- /dev/null +++ b/react-ui/src/index.tsx @@ -0,0 +1,16 @@ +import React from 'react' +import ReactDOM, { Container } from 'react-dom/client' +import './index.css' +import App from './pages/landingpage/App' +import initStore from './stores/api.store' + +initStore({}) + +const root = ReactDOM.createRoot(document.getElementById('root') as Container) + +root.render( + <React.StrictMode> + <App /> + </React.StrictMode> +) + diff --git a/react-ui/src/App.css b/react-ui/src/pages/landingpage/App.css similarity index 100% rename from react-ui/src/App.css rename to react-ui/src/pages/landingpage/App.css diff --git a/react-ui/src/pages/landingpage/App.test.tsx b/react-ui/src/pages/landingpage/App.test.tsx new file mode 100644 index 000000000..103072bab --- /dev/null +++ b/react-ui/src/pages/landingpage/App.test.tsx @@ -0,0 +1,9 @@ +import { render, screen } from '@testing-library/react' +import App from './App' +import React from 'react' + +test('renders learn react link', () => { + render(<App />) + const linkElement = screen.getByText(/learn react/i) + expect(linkElement).toBeInTheDocument() +}) diff --git a/react-ui/src/App.js b/react-ui/src/pages/landingpage/App.tsx similarity index 84% rename from react-ui/src/App.js rename to react-ui/src/pages/landingpage/App.tsx index 09ab5e99d..77f66b4bc 100644 --- a/react-ui/src/App.js +++ b/react-ui/src/pages/landingpage/App.tsx @@ -1,7 +1,7 @@ -import "./App.css"; -import logo from "./logo.svg"; +import './App.css' +import logo from '@assets/logo.svg' -import React from "react"; +import React from 'react' function App() { return ( @@ -21,7 +21,7 @@ function App() { </a> </header> </div> - ); + ) } -export default App; +export default App diff --git a/react-ui/src/reportWebVitals.js b/react-ui/src/reportWebVitals.js deleted file mode 100644 index 5253d3ad9..000000000 --- a/react-ui/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/react-ui/src/setupTests.js b/react-ui/src/setupTests.js index 8f2609b7b..52aaef1d2 100644 --- a/react-ui/src/setupTests.js +++ b/react-ui/src/setupTests.js @@ -2,4 +2,4 @@ // allows you to do things like: // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; +import '@testing-library/jest-dom' diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts new file mode 100644 index 000000000..942865e23 --- /dev/null +++ b/react-ui/src/stores/api.store.ts @@ -0,0 +1,26 @@ +import { combineReducers } from 'redux' +import monitorReducerEnhancer from './enhancer/monitorReducer.enhancer' +import loggerMiddleware from './middleware/logger.middleware' +import mneReducer from './slices/example.reducer' +import { configureStore } from '@reduxjs/toolkit' + +const getReducers = () => { + return combineReducers({ + mneReducer, + }) +} + +const init = (preloadedState: any) => { + const store: any = configureStore({ + reducer: getReducers(), + middleware: (getDefaultMiddleware: any) => + getDefaultMiddleware().concat(loggerMiddleware), + preloadedState, + enhancers: (getDefaultEnhancers: any) => + getDefaultEnhancers().concat(monitorReducerEnhancer), + }) + + return store +} + +export default init diff --git a/react-ui/src/stores/enhancer/monitorReducer.enhancer.ts b/react-ui/src/stores/enhancer/monitorReducer.enhancer.ts new file mode 100644 index 000000000..0b51c8efd --- /dev/null +++ b/react-ui/src/stores/enhancer/monitorReducer.enhancer.ts @@ -0,0 +1,19 @@ +const round = (number: number) => Math.round(number * 100) / 100 + +const monitorReducerEnhancer = + (createStore: any) => (reducer: any, initialState: any, enhancer: any) => { + const monitoredReducer = (state: any, action: any) => { + const start = performance.now() + const newState = reducer(state, action) + const end = performance.now() + const diff = round(end - start) + + console.log('reducer process time:', diff) + + return newState + } + + return createStore(monitoredReducer, initialState, enhancer) + } + +export default monitorReducerEnhancer diff --git a/react-ui/src/stores/middleware/logger.middleware.ts b/react-ui/src/stores/middleware/logger.middleware.ts new file mode 100644 index 000000000..f1dd0d42b --- /dev/null +++ b/react-ui/src/stores/middleware/logger.middleware.ts @@ -0,0 +1,10 @@ +const logger = (store: any) => (next: any) => (action: any) => { + console.group(action.type) + console.info('dispatching', action) + const result = next(action) + console.log('next state', store.getState()) + console.groupEnd() + return result +} + +export default logger diff --git a/react-ui/src/stores/slices/example.reducer.ts b/react-ui/src/stores/slices/example.reducer.ts new file mode 100644 index 000000000..5a343e4a2 --- /dev/null +++ b/react-ui/src/stores/slices/example.reducer.ts @@ -0,0 +1,13 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit' + +const mneSlice = createSlice({ + name: 'test', + initialState: 0, + reducers: { + increment: (state, action: PayloadAction<number>) => + state + action.payload, + }, +}) + +const mneReducer = mneSlice.reducer +export default mneReducer diff --git a/react-ui/tsconfig.eslint.json b/react-ui/tsconfig.eslint.json new file mode 100644 index 000000000..40086b5ba --- /dev/null +++ b/react-ui/tsconfig.eslint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true, + "types": ["jest"] + }, + "include": ["src", "tests"] +} diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json new file mode 100644 index 000000000..1d185143f --- /dev/null +++ b/react-ui/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": ".", + "paths": { + "@assets/*": ["assets/*"], + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] + } \ No newline at end of file diff --git a/react-ui/tsconfig.node.json b/react-ui/tsconfig.node.json new file mode 100644 index 000000000..97ede7ee6 --- /dev/null +++ b/react-ui/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs new file mode 100644 index 000000000..3454c14e0 --- /dev/null +++ b/react-ui/vite.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + server: { + port: 3000, // Standardmäßig wird Port 3000 verwendet, kann aber angepasst werden + }, + resolve: { + alias: { + '@assets': '/assets', + }, + }, + // build: { + // outDir: 'dist', // Standardmäßiger Ausgabepfad für den Build + // sourcemap: true, // Source Maps für den Build aktivieren + // }, +}); \ No newline at end of file diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 6da56475a..788a45858 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -37,11 +37,24 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" +"@babel/code-frame@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" + integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== + dependencies: + "@babel/highlight" "^7.24.6" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.6.tgz#b3600217688cabb26e25f8e467019e66d71b7ae2" + integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== + "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" @@ -63,6 +76,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.24.5": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787" + integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helpers" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/template" "^7.24.6" + "@babel/traverse" "^7.24.6" + "@babel/types" "^7.24.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/eslint-parser@^7.16.3": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" @@ -82,6 +116,16 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.6.tgz#dfac82a228582a9d30c959fe50ad28951d4737a7" + integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== + dependencies: + "@babel/types" "^7.24.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -107,6 +151,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz#4a51d681f7680043d38e212715e2a7b1ad29cb51" + integrity sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg== + dependencies: + "@babel/compat-data" "^7.24.6" + "@babel/helper-validator-option" "^7.24.6" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" @@ -147,6 +202,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz#ac7ad5517821641550f6698dd5468f8cef78620d" + integrity sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g== + "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" @@ -155,6 +215,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.23.0" +"@babel/helper-function-name@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz#cebdd063386fdb95d511d84b117e51fc68fec0c8" + integrity sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -162,6 +230,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-hoist-variables@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz#8a7ece8c26756826b6ffcdd0e3cf65de275af7f9" + integrity sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" @@ -176,6 +251,13 @@ dependencies: "@babel/types" "^7.24.0" +"@babel/helper-module-imports@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz#65e54ffceed6a268dc4ce11f0433b82cfff57852" + integrity sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" @@ -187,6 +269,17 @@ "@babel/helper-split-export-declaration" "^7.24.5" "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-module-transforms@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz#22346ed9df44ce84dee850d7433c5b73fab1fe4e" + integrity sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA== + dependencies: + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-module-imports" "^7.24.6" + "@babel/helper-simple-access" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -199,6 +292,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== +"@babel/helper-plugin-utils@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz#fa02a32410a15a6e8f8185bcbf608f10528d2a24" + integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== + "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" @@ -224,6 +322,13 @@ dependencies: "@babel/types" "^7.24.5" +"@babel/helper-simple-access@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz#1d6e04d468bba4fc963b4906f6dac6286cfedff1" + integrity sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g== + dependencies: + "@babel/types" "^7.24.6" + "@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.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" @@ -238,21 +343,43 @@ dependencies: "@babel/types" "^7.24.5" +"@babel/helper-split-export-declaration@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz#e830068f7ba8861c53b7421c284da30ae656d7a3" + integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-string-parser@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@babel/helper-string-parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" + integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== + "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== +"@babel/helper-validator-identifier@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" + integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@babel/helper-validator-option@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz#59d8e81c40b7d9109ab7e74457393442177f460a" + integrity sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ== + "@babel/helper-wrap-function@^7.22.20": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" @@ -271,6 +398,14 @@ "@babel/traverse" "^7.24.5" "@babel/types" "^7.24.5" +"@babel/helpers@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.6.tgz#cd124245299e494bd4e00edda0e4ea3545c2c176" + integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/highlight@^7.24.2": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" @@ -281,11 +416,26 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" + integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== + dependencies: + "@babel/helper-validator-identifier" "^7.24.6" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== +"@babel/parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" + integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" @@ -869,6 +1019,20 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" +"@babel/plugin-transform-react-jsx-self@^7.24.5": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.6.tgz#4fa4870d594d6840d724d2006d0f98b19be6f502" + integrity sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.6" + +"@babel/plugin-transform-react-jsx-source@^7.24.1": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.6.tgz#4e1503f24ca5fccb1fc7f20c57426899d5ce5c1f" + integrity sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" @@ -1116,7 +1280,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== @@ -1132,6 +1296,15 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/template@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.6.tgz#048c347b2787a6072b24c723664c8d02b67a44f9" + integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/traverse@^7.24.5", "@babel/traverse@^7.7.2": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" @@ -1148,6 +1321,22 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.6.tgz#0941ec50cdeaeacad0911eb67ae227a4f8424edc" + integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-hoist-variables" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" @@ -1157,6 +1346,15 @@ "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" +"@babel/types@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" + integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== + dependencies: + "@babel/helper-string-parser" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1273,6 +1471,121 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1280,7 +1593,7 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== @@ -1685,12 +1998,22 @@ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@react-aria/ssr@^3.5.0": - version "3.9.3" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.3.tgz#9e7d4e019965aaf86cec3da2411a392be49ac2b3" - integrity sha512-5bUZ93dmvHFcmfUcEN7qzYe8yQQ8JY+nHN6m9/iSDCQ/QmCiE0kWXYwhurjw5ch6I8WokQzx66xKIMHBAa4NNA== + version "3.9.4" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.4.tgz#9da8b10342c156e816dbfa4c9e713b21f274d7ab" + integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ== dependencies: "@swc/helpers" "^0.5.0" +"@reduxjs/toolkit@^2.2.4": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.5.tgz#c0d2d8482ef80722bebe015ff05b06c34bfb6e0d" + integrity sha512-aeFA/s5NCG7NoJe/MhmwREJxRkDs0ZaSqt0MxhWUrwCf1UQXpwR87RROJEql0uAkLI6U7snBOYOcKw83ew3FPg== + dependencies: + immer "^10.0.3" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.1.0" + "@restart/hooks@^0.4.9": version "0.4.16" resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" @@ -1750,10 +2073,90 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@rollup/rollup-android-arm-eabi@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" + integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + +"@rollup/rollup-android-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" + integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + +"@rollup/rollup-darwin-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" + integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + +"@rollup/rollup-darwin-x64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" + integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + +"@rollup/rollup-linux-arm-gnueabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" + integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + +"@rollup/rollup-linux-arm-musleabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" + integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + +"@rollup/rollup-linux-arm64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" + integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + +"@rollup/rollup-linux-arm64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" + integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" + integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + +"@rollup/rollup-linux-riscv64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" + integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + +"@rollup/rollup-linux-s390x-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" + integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + +"@rollup/rollup-linux-x64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" + integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + +"@rollup/rollup-linux-x64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" + integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + +"@rollup/rollup-win32-arm64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" + integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + +"@rollup/rollup-win32-ia32-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" + integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + +"@rollup/rollup-win32-x64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== + "@rushstack/eslint-patch@^1.1.0": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" - integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== + version "1.10.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" + integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== "@sinclair/typebox@^0.24.1": version "0.24.51" @@ -1959,7 +2362,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== @@ -1986,9 +2389,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" @@ -2038,7 +2441,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -2049,9 +2452,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" - integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== + version "4.19.1" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.1.tgz#57d34698bb580720fd6e3c360d4b2fdef579b979" + integrity sha512-ej0phymbFLoCB26dbbq5PGScsf2JAJ4IJHjG10LalgUV36XKTmA4GdA+PVllKvRk0sEKt64X8975qFnkSi0hqA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2119,7 +2522,7 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2142,9 +2545,9 @@ "@types/node" "*" "@types/node@*": - version "20.12.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" - integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== + version "20.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" + integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== dependencies: undici-types "~5.26.4" @@ -2178,7 +2581,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@^18.0.0": +"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.22": version "18.3.0" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== @@ -2200,6 +2603,14 @@ "@types/prop-types" "*" csstype "^3.0.2" +"@types/react@^18.2.66": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -2212,7 +2623,7 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/semver@^7.3.12", "@types/semver@^7.5.8": +"@types/semver@^7.3.12": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== @@ -2265,6 +2676,11 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/warning@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" @@ -2312,6 +2728,21 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^7.2.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz#07854a236f107bb45cbf4f62b89474cbea617f50" + integrity sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.10.0" + "@typescript-eslint/type-utils" "7.10.0" + "@typescript-eslint/utils" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/experimental-utils@^5.0.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" @@ -2329,6 +2760,17 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" +"@typescript-eslint/parser@^7.2.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.10.0.tgz#e6ac1cba7bc0400a4459e7eb5b23115bd71accfb" + integrity sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w== + dependencies: + "@typescript-eslint/scope-manager" "7.10.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/typescript-estree" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -2337,13 +2779,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047" - integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g== +"@typescript-eslint/scope-manager@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz#054a27b1090199337a39cf755f83d9f2ce26546b" + integrity sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg== dependencies: - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" "@typescript-eslint/type-utils@5.62.0": version "5.62.0" @@ -2355,15 +2797,25 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz#8a75accce851d0a331aa9331268ef64e9b300270" + integrity sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g== + dependencies: + "@typescript-eslint/typescript-estree" "7.10.0" + "@typescript-eslint/utils" "7.10.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d" - integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw== +"@typescript-eslint/types@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.10.0.tgz#da92309c97932a3a033762fd5faa8b067de84e3b" + integrity sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -2378,13 +2830,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c" - integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg== +"@typescript-eslint/typescript-estree@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz#6dcdc5de3149916a6a599fa89dde5c471b88b8bb" + integrity sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g== dependencies: - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2406,18 +2858,15 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@^6.0.0 || ^7.0.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd" - integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ== +"@typescript-eslint/utils@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.10.0.tgz#8ee43e5608c9f439524eaaea8de5b358b15c51b3" + integrity sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.15" - "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.8.0" - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/typescript-estree" "7.8.0" - semver "^7.6.0" + "@typescript-eslint/scope-manager" "7.10.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/typescript-estree" "7.10.0" "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" @@ -2427,12 +2876,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91" - integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA== +"@typescript-eslint/visitor-keys@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz#2af2e91e73a75dd6b70b4486c48ae9d38a485a78" + integrity sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg== dependencies: - "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/types" "7.10.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -2440,6 +2889,17 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@vitejs/plugin-react@^4.2.1": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.0.tgz#f20ec2369a92d8abaaefa60da8b7157819d20481" + integrity sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw== + dependencies: + "@babel/core" "^7.24.5" + "@babel/plugin-transform-react-jsx-self" "^7.24.5" + "@babel/plugin-transform-react-jsx-source" "^7.24.1" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" @@ -3167,12 +3627,12 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browser-process-hrtime@^1.0.0: version "1.0.0" @@ -3266,9 +3726,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001617" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" - integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== + version "1.0.30001621" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz#4adcb443c8b9c8303e04498318f987616b8fea2e" + integrity sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -3481,7 +3941,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -confusing-browser-globals@^1.0.11: +confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== @@ -3524,21 +3984,21 @@ cookie@0.6.0: integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" - integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: browserslist "^4.23.0" core-js-pure@^3.23.3: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.0.tgz#ce99fb4a7cec023fdbbe5b5bd1f06bbcba83316e" - integrity sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ== + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.1.tgz#2b4b34281f54db06c9a9a5bd60105046900553bd" + integrity sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA== core-js@^3.19.2: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb" - integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug== + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.1.tgz#d21751ddb756518ac5a00e4d66499df981a62db9" + integrity sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw== core-util-is@~1.0.0: version "1.0.3" @@ -4122,9 +4582,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.668: - version "1.4.763" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz#64f2041ed496fd6fc710b9be806fe91da9334f91" - integrity sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ== + version "1.4.779" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.779.tgz#bb6f08b93092a564421adcadcc4b92c5055c7a77" + integrity sha512-oaTiIcszNfySXVJzKcjxd2YjPxziAd+GmXyb2HbidCeFo6Z88ygOT7EimlrEQhM2U08VhSrbKhLOXP0kKUCZ6g== emittery@^0.10.2: version "0.10.2" @@ -4288,9 +4748,9 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.2.tgz#00b423304f2500ac59359cc9b6844951f372d497" - integrity sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA== + version "1.5.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.3.tgz#25969419de9c0b1fbe54279789023e8a9a788412" + integrity sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== es-object-atoms@^1.0.0: version "1.0.0" @@ -4324,6 +4784,35 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -4372,6 +4861,28 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^16.1.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.2.0.tgz#9193fafd62f1cbf444895f4495eae334baf3265b" + integrity sha512-OUaMPZpTOZGKd5tXOjJ9PRU4iYNW/Z5DoHIynjsVK/FpkWdiY5+nxQW6TiJAlLwVI1l53xUOrnlZWtVBVQzuWA== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-config-prettier@^8.0.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + eslint-config-react-app@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" @@ -4416,7 +4927,7 @@ eslint-plugin-flowtype@^8.0.3: lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.25.3: +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: version "2.29.1" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== @@ -4446,14 +4957,7 @@ eslint-plugin-jest@^25.3.0: dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" -eslint-plugin-jest@^28.5.0: - version "28.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.5.0.tgz#b497b795de37f671eaccd38bd83030186ff5dc8d" - integrity sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ== - dependencies: - "@typescript-eslint/utils" "^6.0.0 || ^7.0.0" - -eslint-plugin-jsx-a11y@^6.5.1: +eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== @@ -4475,12 +4979,24 @@ eslint-plugin-jsx-a11y@^6.5.1: object.entries "^1.1.7" object.fromentries "^2.0.7" -eslint-plugin-react-hooks@^4.3.0: +eslint-plugin-prettier@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: version "4.6.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.34.1: +eslint-plugin-react-refresh@^0.4.6: + version "0.4.7" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz#1f597f9093b254f10ee0961c139a749acb19af7d" + integrity sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw== + +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.2: version "7.34.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== @@ -4548,7 +5064,7 @@ eslint-webpack-plugin@^3.1.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.0.0, eslint@^8.3.0: +eslint@^8.3.0, eslint@^8.57.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -4743,6 +5259,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -4812,10 +5333,10 @@ filesize@^8.0.6: resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -4970,7 +5491,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -5060,12 +5581,12 @@ glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^10.3.10: - version "10.3.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.15.tgz#e72bc61bc3038c90605f5dd48543dc67aaf3b50d" - integrity sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw== + version "10.3.16" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.16.tgz#bf6679d5d51279c8cfae4febe0d051d2a4bf4c6f" + integrity sha512-JDKXl1DiuuHJ6fVS2FXjownaavciiHNUU4mOvV/B793RLh05vZL1rcPnCSaOgv1hDT6RDlY7AB7ZUvFYAtPgAw== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.6" + jackspeak "^3.1.2" minimatch "^9.0.1" minipass "^7.0.4" path-scurry "^1.11.0" @@ -5110,11 +5631,6 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globals@^15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.2.0.tgz#fbcea7f8964a71d8c6e6867ddadb9788ae1083d8" - integrity sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A== - globalthis@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -5390,11 +5906,16 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ignore@^5.2.0: +ignore@^5.2.0, ignore@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +immer@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + immer@^9.0.7: version "9.0.21" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" @@ -5795,10 +6316,10 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" -jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +jackspeak@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.1.2.tgz#eada67ea949c6b71de50f1b09c92a961897b90ab" + integrity sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -6514,9 +7035,9 @@ klona@^2.0.4, klona@^2.0.5: integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" @@ -6742,11 +7263,11 @@ methods@~1.1.2: integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": @@ -6976,7 +7497,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4, object.assign@^4.1.5: +object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -6986,7 +7507,7 @@ object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.7: +object.entries@^1.1.5, object.entries@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -7253,10 +7774,10 @@ picocolors@^0.2.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -7800,9 +8321,9 @@ postcss-selector-not@^6.0.1: postcss-selector-parser "^6.0.10" postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -7835,7 +8356,7 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: +postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.4: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -7854,6 +8375,18 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.0.0: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -8094,11 +8627,24 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== + dependencies: + "@types/use-sync-external-store" "^0.0.3" + use-sync-external-store "^1.0.0" + react-refresh@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + react-scripts@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" @@ -8222,6 +8768,16 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== + +redux@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== + reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -8329,6 +8885,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reselect@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" + integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -8414,6 +8975,31 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" +rollup@^4.13.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -8835,7 +9421,16 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" + +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8922,7 +9517,14 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9371,6 +9973,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript@^5.2.2: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -9462,12 +10069,12 @@ upath@^1.2.0: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-browserslist-db@^1.0.13: - version "1.0.15" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" - integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: escalade "^3.1.2" - picocolors "^1.0.0" + picocolors "^1.0.1" uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" @@ -9484,6 +10091,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-sync-external-store@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -9528,6 +10140,17 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vite@^5.2.0: + version "5.2.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" + integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== + dependencies: + esbuild "^0.20.1" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -9984,7 +10607,16 @@ workbox-window@6.6.1: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + 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.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== -- GitLab From 6a352c80fdd51f228aa93cdf2d95dc700b35203b Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 27 May 2024 01:00:29 +0200 Subject: [PATCH 03/78] transform redux into typescript --- react-ui/.eslintrc.cjs | 2 +- react-ui/src/stores/api.store.ts | 21 ++++++------------- .../enhancer/monitorReducer.enhancer.ts | 19 ----------------- .../stores/middleware/logger.middleware.ts | 10 --------- 4 files changed, 7 insertions(+), 45 deletions(-) delete mode 100644 react-ui/src/stores/enhancer/monitorReducer.enhancer.ts delete mode 100644 react-ui/src/stores/middleware/logger.middleware.ts diff --git a/react-ui/.eslintrc.cjs b/react-ui/.eslintrc.cjs index d6c953795..5dfef877d 100644 --- a/react-ui/.eslintrc.cjs +++ b/react-ui/.eslintrc.cjs @@ -6,7 +6,7 @@ module.exports = { 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', ], - ignorePatterns: ['dist', '.eslintrc.cjs'], + ignorePatterns: ['dist', '.eslintrc.cjs', 'src/api/*'], parser: '@typescript-eslint/parser', plugins: ['react-refresh'], rules: { diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index 942865e23..bc400dfae 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -1,7 +1,6 @@ import { combineReducers } from 'redux' -import monitorReducerEnhancer from './enhancer/monitorReducer.enhancer' -import loggerMiddleware from './middleware/logger.middleware' import mneReducer from './slices/example.reducer' + import { configureStore } from '@reduxjs/toolkit' const getReducers = () => { @@ -10,17 +9,9 @@ const getReducers = () => { }) } -const init = (preloadedState: any) => { - const store: any = configureStore({ - reducer: getReducers(), - middleware: (getDefaultMiddleware: any) => - getDefaultMiddleware().concat(loggerMiddleware), - preloadedState, - enhancers: (getDefaultEnhancers: any) => - getDefaultEnhancers().concat(monitorReducerEnhancer), - }) - - return store -} +const store = configureStore({ + reducer: getReducers(), +}) -export default init +export type RootState = ReturnType<typeof store.getState> +export default store diff --git a/react-ui/src/stores/enhancer/monitorReducer.enhancer.ts b/react-ui/src/stores/enhancer/monitorReducer.enhancer.ts deleted file mode 100644 index 0b51c8efd..000000000 --- a/react-ui/src/stores/enhancer/monitorReducer.enhancer.ts +++ /dev/null @@ -1,19 +0,0 @@ -const round = (number: number) => Math.round(number * 100) / 100 - -const monitorReducerEnhancer = - (createStore: any) => (reducer: any, initialState: any, enhancer: any) => { - const monitoredReducer = (state: any, action: any) => { - const start = performance.now() - const newState = reducer(state, action) - const end = performance.now() - const diff = round(end - start) - - console.log('reducer process time:', diff) - - return newState - } - - return createStore(monitoredReducer, initialState, enhancer) - } - -export default monitorReducerEnhancer diff --git a/react-ui/src/stores/middleware/logger.middleware.ts b/react-ui/src/stores/middleware/logger.middleware.ts deleted file mode 100644 index f1dd0d42b..000000000 --- a/react-ui/src/stores/middleware/logger.middleware.ts +++ /dev/null @@ -1,10 +0,0 @@ -const logger = (store: any) => (next: any) => (action: any) => { - console.group(action.type) - console.info('dispatching', action) - const result = next(action) - console.log('next state', store.getState()) - console.groupEnd() - return result -} - -export default logger -- GitLab From a7175560df74b53deed5563a75624766bb88aec1 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 28 May 2024 14:23:13 +0200 Subject: [PATCH 04/78] implement login ui --- .gitlab/ci/.react-ui.yml | 3 + react-ui/.eslintrc.cjs | 2 +- react-ui/README.md | 2 +- react-ui/assets/logo.svg | 18 +- react-ui/docs/design.md | 8 + react-ui/index.html | 27 +-- react-ui/package.json | 19 +- react-ui/public/logo.png | Bin 0 -> 66912 bytes react-ui/public/logo.svg | 17 ++ react-ui/public/logo192.png | Bin 5347 -> 0 bytes react-ui/public/logo512.png | Bin 9664 -> 0 bytes react-ui/public/manifest.json | 9 +- react-ui/src/i18n/config.js | 13 ++ .../src/i18n/locales/en/translations.json | 14 ++ react-ui/src/{index.css => index.scss} | 8 +- react-ui/src/index.tsx | 35 +++- .../landingpage/{App.css => landingpage.scss} | 1 - .../pages/landingpage/landingpage.test.tsx | 9 + .../landingpage/{App.tsx => landingpage.tsx} | 8 +- react-ui/src/pages/login/login.scss | 8 + .../App.test.tsx => login/login.test.tsx} | 2 +- react-ui/src/pages/login/login.tsx | 76 ++++++++ react-ui/src/router.tsx | 169 ++++++++++++++++++ react-ui/src/stores/api.store.ts | 17 +- react-ui/src/stores/slices/example.reducer.ts | 13 -- react-ui/src/stores/slices/user.reducer.ts | 31 ++++ react-ui/src/style/box.scss | 8 + react-ui/src/style/style.scss | 10 ++ react-ui/src/style/utils.scss | 3 + react-ui/tsconfig.json | 8 +- react-ui/vite.config.mjs | 2 + react-ui/yarn.lock | 103 +++++++---- 32 files changed, 532 insertions(+), 111 deletions(-) create mode 100644 .gitlab/ci/.react-ui.yml create mode 100644 react-ui/docs/design.md create mode 100644 react-ui/public/logo.png create mode 100644 react-ui/public/logo.svg delete mode 100644 react-ui/public/logo192.png delete mode 100644 react-ui/public/logo512.png create mode 100644 react-ui/src/i18n/config.js create mode 100644 react-ui/src/i18n/locales/en/translations.json rename react-ui/src/{index.css => index.scss} (73%) rename react-ui/src/pages/landingpage/{App.css => landingpage.scss} (92%) create mode 100644 react-ui/src/pages/landingpage/landingpage.test.tsx rename react-ui/src/pages/landingpage/{App.tsx => landingpage.tsx} (88%) create mode 100644 react-ui/src/pages/login/login.scss rename react-ui/src/pages/{landingpage/App.test.tsx => login/login.test.tsx} (90%) create mode 100644 react-ui/src/pages/login/login.tsx create mode 100644 react-ui/src/router.tsx delete mode 100644 react-ui/src/stores/slices/example.reducer.ts create mode 100644 react-ui/src/stores/slices/user.reducer.ts create mode 100644 react-ui/src/style/box.scss create mode 100644 react-ui/src/style/style.scss create mode 100644 react-ui/src/style/utils.scss diff --git a/.gitlab/ci/.react-ui.yml b/.gitlab/ci/.react-ui.yml new file mode 100644 index 000000000..873b694c8 --- /dev/null +++ b/.gitlab/ci/.react-ui.yml @@ -0,0 +1,3 @@ +build-react-ui: + stage: build + \ No newline at end of file diff --git a/react-ui/.eslintrc.cjs b/react-ui/.eslintrc.cjs index 5dfef877d..c4290113a 100644 --- a/react-ui/.eslintrc.cjs +++ b/react-ui/.eslintrc.cjs @@ -6,7 +6,7 @@ module.exports = { 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', ], - ignorePatterns: ['dist', '.eslintrc.cjs', 'src/api/*'], + ignorePatterns: ['dist', '.eslintrc.cjs', './src/i18n/config.js', 'src/api/*'], parser: '@typescript-eslint/parser', plugins: ['react-refresh'], rules: { diff --git a/react-ui/README.md b/react-ui/README.md index 6426c57c6..b6c8b0ba1 100644 --- a/react-ui/README.md +++ b/react-ui/README.md @@ -1,5 +1,5 @@ # React - UI -This is the UI for the goSDN project. It's a webapp written in rust +This is the UI for the goSDN project. It's a webapp written in react ### Getting started diff --git a/react-ui/assets/logo.svg b/react-ui/assets/logo.svg index 9dfc1c058..b7f71bd90 100644 --- a/react-ui/assets/logo.svg +++ b/react-ui/assets/logo.svg @@ -1 +1,17 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg> \ No newline at end of file +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with Vectornator (http://vectornator.io/) --> +<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 113.4 212.625" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:vectornator="http://vectornator.io" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> +<radialGradient cx="170.235" cy="146.046" gradientTransform="matrix(1.00001 -8.65109e-05 8.65119e-05 1 -115.465 -116.986)" gradientUnits="userSpaceOnUse" id="RadialGradient" r="217.591"> +<stop offset="0" stop-color="#c456f7"/> +<stop offset="1" stop-color="#34054a"/> +</radialGradient> +<filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="209.692" id="Filter" width="111.957" x="0.722269" y="2.46642"> +<feDropShadow dx="-4.37114e-08" dy="1" flood-color="#050505" flood-opacity="1" in="SourceGraphic" result="Shadow" stdDeviation="1"/> +</filter> +</defs> +<g id="Layer-1" vectornator:layerName="Layer 1"> +<path d="M35.1413 3.47016L35.1416 6.93891L27.1415 6.93961L27.1464 63.3771C21.6096 65.0011 16.4869 67.0445 12.2717 69.6596C-9.35807 83.0789 12.5182 123.232 12.5264 123.222C12.5341 123.213 12.5498 123.2 12.5576 123.191C13.1518 124.609 14.5144 125.761 16.5579 126.534C18.7737 127.372 21.8204 127.855 26.8082 128.408C25.0644 132.318 24.4639 137.732 25.3409 144.846C26.0816 150.854 28.2327 155.309 32.5924 161.533C32.9615 162.06 34.1761 163.796 34.3427 164.033C35.013 164.984 35.5416 165.705 35.9991 166.408C38.1084 169.647 39.1319 172.149 39.3124 174.814C39.3701 175.665 39.3355 180.513 39.251 187.751C39.2362 189.024 39.0999 200.614 39.0959 200.907C37.7122 201.653 36.7523 203.069 36.7525 204.751C36.7527 207.19 38.7205 209.157 41.1591 209.157C43.5978 209.157 45.5653 207.189 45.5651 204.751C45.5649 203.019 44.5477 201.568 43.096 200.844C43.1023 200.341 43.2363 189.045 43.2511 187.782C43.3388 180.268 43.3816 175.583 43.3124 174.563C43.0775 171.096 41.7912 168.012 39.3427 164.251C38.854 163.5 38.3197 162.708 37.6237 161.72C37.4507 161.474 36.2342 159.766 35.8735 159.251C31.8564 153.517 29.9529 149.563 29.3096 144.346C28.2621 135.848 29.4895 130.5 32.027 127.533C32.6413 126.815 33.2789 126.306 33.9019 125.97C34.2334 125.792 34.4442 125.7 34.4956 125.689C35.5735 125.448 36.2365 124.392 35.9954 123.314C35.7543 122.236 34.6982 121.542 33.6202 121.783C33.2264 121.871 32.6655 122.078 31.9953 122.439C31.0669 122.939 30.1635 123.734 29.3079 124.658C23.0392 124.019 20.0922 123.577 17.9951 122.784C16.1482 122.086 15.9773 121.63 16.7137 120.347C25.511 115.923 43.9287 113.157 55.0885 113.156C63.8081 113.155 79.7952 116.873 90.4333 119.622C93.9977 120.542 94.7294 120.755 96.621 121.277C94.2649 123.034 89.4439 124.738 83.3087 125.247C83.0835 125.266 82.9434 125.443 82.7462 125.529C82.6074 125.348 82.5171 125.106 82.3711 124.935C81.4271 123.831 80.3863 122.999 79.3396 122.435C78.6693 122.074 78.1085 121.867 77.7145 121.779C76.6365 121.538 75.5805 122.233 75.3396 123.31C75.0987 124.388 75.7619 125.444 76.8399 125.685C76.8913 125.697 77.1021 125.788 77.4337 125.967C78.0567 126.302 78.6942 126.81 79.3088 127.529C81.8468 130.496 83.0751 135.844 82.029 144.341C81.3867 149.559 79.4839 153.513 75.4678 159.248C75.1071 159.763 73.8909 161.471 73.7179 161.717C73.0221 162.705 72.488 163.498 71.9994 164.248C69.5516 168.009 68.2658 171.094 68.0315 174.561C67.9625 175.581 68.0061 180.266 68.0951 187.78C68.1102 189.055 68.2793 200.673 68.2838 200.967C66.9421 201.725 66.0027 203.098 66.0028 204.749C66.0031 207.187 67.9709 209.155 70.4095 209.155C72.8481 209.154 74.8156 207.187 74.8154 204.748C74.8153 202.975 73.7598 201.482 72.2526 200.779C72.2461 200.277 72.1101 189.009 72.0952 187.748C72.0095 180.511 71.974 175.662 72.0316 174.811C72.2116 172.146 73.2659 169.644 75.3746 166.404C75.8321 165.701 76.3292 164.981 76.9994 164.029C77.1659 163.793 78.3803 162.056 78.7492 161.529C83.1079 155.305 85.2582 150.849 85.9979 144.841C86.8306 138.077 86.2654 132.917 84.7153 129.06C93.073 128.178 99.944 125.471 101.777 121.527C105.258 116.592 120.674 81.4184 100.46 69.1833C96.4145 66.7344 91.6503 64.7196 86.3971 63.1845L86.3922 6.93448L78.3609 6.93517L78.3606 3.46642L35.1413 3.47016ZM31.1419 10.9393L39.1107 10.9386L39.3309 27.9386C39.3406 28.6841 39.9605 29.2606 40.7061 29.2509C41.4516 29.2413 42.0593 28.6214 42.0497 27.8758L41.7983 10.9383L44.517 10.9381L44.7998 27.9381C44.8108 28.6836 45.3981 29.2615 46.1436 29.2505C46.8892 29.2394 47.4983 28.6209 47.4873 27.8753L47.2358 10.9379L49.9546 10.9376L50.2061 27.9376C50.2169 28.6831 50.8357 29.2608 51.5812 29.25C52.3267 29.2392 52.9044 28.6203 52.8936 27.8749L52.6421 10.9374L55.3609 10.9372L55.6124 27.9371C55.623 28.6827 56.242 29.2601 56.9875 29.2495C57.733 29.2389 58.3418 28.6199 58.3312 27.8744L58.0797 10.9369L60.8297 10.9367L61.05 27.9367C61.0546 28.3094 61.2147 28.6381 61.4563 28.8741C61.6979 29.1102 62.0211 29.2537 62.3938 29.2491C63.1394 29.2398 63.7468 28.6194 63.7375 27.8739L63.5173 10.9365L66.2986 10.9362L66.4875 27.905C66.4957 28.6505 67.1171 29.2568 67.8627 29.2486C68.6082 29.2404 69.1834 28.6503 69.1751 27.9047L68.9861 10.936L71.7674 10.9357L71.9564 27.9357C71.9605 28.3085 72.1132 28.6372 72.3627 28.8732C72.6122 29.1091 72.9587 29.2523 73.3315 29.2481C74.077 29.2398 74.6833 28.6498 74.6751 27.9042L74.4862 10.9355L82.3925 10.9348L82.3969 62.2473C78.1953 61.2363 73.8195 60.4151 69.2716 59.936L69.0841 59.936L69.0846 65.9672L62.3352 73.3116L62.211 82.5928L62.212 94.7803L56.5244 94.7808L50.3056 94.7814L50.2733 82.9376L50.1163 73.3126L43.1468 65.8132L43.1463 60.0945L31.1463 62.3455L31.1419 10.9393ZM46.0197 41.188L45.9904 64.3755L52.9599 71.8749L53.1492 91.9374L59.368 91.9368L59.5225 71.8743L66.2407 64.5612L66.2387 41.3425L46.0197 41.188ZM45.5578 121.282C45.0484 121.232 44.5158 121.369 44.0891 121.719C43.2356 122.421 43.1382 123.71 43.8394 124.563C43.8712 124.602 43.9181 124.67 44.0269 124.813C44.2163 125.062 44.4521 125.354 44.6832 125.688C45.3494 126.65 45.998 127.755 46.621 128.938C48.9603 133.379 50.0248 137.836 49.1222 141.875C48.4351 144.95 46.6061 147.711 43.4353 150.126C43.1568 150.338 42.1644 150.942 40.7792 151.751C40.6905 151.803 37.4839 153.662 37.4356 153.689C36.4728 154.23 36.1131 155.445 36.6545 156.408C37.1959 157.37 38.4106 157.699 39.3734 157.157C39.4251 157.128 42.7199 155.272 42.8108 155.22C44.3781 154.304 45.4057 153.669 45.8731 153.313C49.7829 150.336 52.1324 146.76 53.0285 142.75C54.1746 137.622 52.9238 132.266 50.1834 127.063C49.4811 125.729 48.7181 124.526 47.9643 123.438C47.5056 122.775 47.1244 122.271 46.9017 122C46.5511 121.574 46.0673 121.332 45.5578 121.282ZM65.7769 121.28C65.2675 121.33 64.7837 121.572 64.4331 121.999C64.2105 122.27 63.8293 122.774 63.3708 123.436C62.6172 124.525 61.8858 125.728 61.1835 127.062C58.444 132.265 57.163 137.621 58.3099 142.749C59.2067 146.759 61.5569 150.335 65.4671 153.311C65.9346 153.667 66.9935 154.302 68.5611 155.217C68.6519 155.27 71.9158 157.125 71.9675 157.154C72.9304 157.696 74.145 157.367 74.6862 156.404C75.2275 155.441 74.8676 154.227 73.9048 153.686C73.8565 153.658 70.6495 151.8 70.5608 151.748C69.1754 150.939 68.1829 150.336 67.9044 150.124C64.7332 147.71 62.9036 144.948 62.2161 141.874C61.3128 137.835 62.3766 133.378 64.715 128.936C65.3378 127.753 65.9862 126.649 66.6522 125.686C66.8833 125.352 67.1191 125.06 67.3084 124.811C67.4172 124.668 67.4953 124.6 67.5272 124.561C68.2282 123.708 68.0992 122.418 67.2457 121.717C66.8189 121.367 66.2862 121.23 65.7769 121.28ZM28.3735 160.064C27.8641 160.114 27.3492 160.357 26.9985 160.783C24.0604 164.358 22.5881 168.723 22.5621 174.253C22.5614 174.404 22.6311 200.839 22.627 200.877C21.1966 201.608 20.1896 203.036 20.1898 204.753C20.19 207.191 22.1578 209.159 24.5964 209.159C27.0351 209.158 29.0026 207.191 29.0024 204.752C29.0022 203.061 28.0235 201.65 26.627 200.908C26.6562 200.425 26.6538 197.055 26.6259 187.658C26.6229 186.662 26.5615 174.385 26.5622 174.252C26.584 169.618 27.7563 166.157 30.0925 163.314C30.7939 162.461 30.6644 161.203 29.811 160.502C29.3844 160.151 28.8829 160.015 28.3735 160.064ZM82.9679 160.06C82.4585 160.01 81.9571 160.147 81.5304 160.497C80.6772 161.199 80.5479 162.457 81.2494 163.31C83.5862 166.152 84.7591 169.613 84.7817 174.247C84.7823 174.378 84.7241 199.67 84.7527 200.841C83.3011 201.564 82.2529 203.015 82.253 204.747C82.2533 207.186 84.2524 209.153 86.691 209.153C89.1295 209.153 91.0971 207.185 91.0969 204.747C91.0967 203.049 90.1265 201.611 88.7215 200.872C88.7173 200.833 88.7318 194.753 88.7516 187.684C88.7544 186.688 88.7824 174.398 88.7817 174.247C88.7548 168.717 87.2817 164.353 84.343 160.778C83.9922 160.352 83.4774 160.109 82.9679 160.06Z" fill="url(#RadialGradient)" fill-rule="nonzero" filter="url(#Filter)" stroke="none" vectornator:shadowAngle="1.5708" vectornator:shadowColor="#050505" vectornator:shadowOffset="1" vectornator:shadowOpacity="1" vectornator:shadowRadius="2"/> +</g> +</svg> diff --git a/react-ui/docs/design.md b/react-ui/docs/design.md new file mode 100644 index 000000000..e35e46ac7 --- /dev/null +++ b/react-ui/docs/design.md @@ -0,0 +1,8 @@ +## Design +Global styles for predefined components can be found in `./src/styles`. There are definitinos for the following components: +- box for content (c-box) + + +#### Colors +- Primary: #b551e1 +- Secondary: \ No newline at end of file diff --git a/react-ui/index.html b/react-ui/index.html index e444585a7..91d50a11c 100644 --- a/react-ui/index.html +++ b/react-ui/index.html @@ -9,36 +9,13 @@ name="description" content="Web site created using create-react-app" /> - <link rel="apple-touch-icon" href="logo192.png" /> - <!-- - manifest.json provides metadata used when your web app is installed on a - user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ - --> + <link rel="apple-touch-icon" href="logo.png" /> <link rel="manifest" href="manifest.json" /> - <!-- - Notice the use of %PUBLIC_URL% in the tags above. - It will be replaced with the URL of the `public` folder during the build. - Only files inside the `public` folder can be referenced from the HTML. - - Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will - work correctly both with client-side routing and a non-root public URL. - Learn how to configure a non-root public URL by running `npm run build`. - --> - <title>React App</title> + <title>goSDN</title> </head> <body> <noscript>You need to enable JavaScript to run this app.</noscript> <div id="root"></div> <script type="module" src="/src/index.tsx"></script> - <!-- - This HTML file is a template. - If you open it directly in the browser, you will see an empty page. - - You can add webfonts, meta tags, or analytics to this file. - The build step will place the bundled scripts into the <body> tag. - - To begin the development, run `npm start` or `yarn start`. - To create a production bundle, use `npm run build` or `yarn build`. - --> </body> </html> diff --git a/react-ui/package.json b/react-ui/package.json index 13bfaba15..16a92a477 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -8,10 +8,13 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "bootstrap": "^5.3.3", + "i18next": "^23.11.5", "react": "^18.3.1", "react-bootstrap": "^2.10.2", "react-dom": "^18.3.1", + "react-i18next": "^14.1.2", "react-redux": "^9.1.2", + "react-router-dom": "^6.23.1", "react-scripts": "5.0.1", "redux": "^5.0.1", "web-vitals": "^2.1.4" @@ -44,22 +47,22 @@ }, "devDependencies": { "@babel/runtime": "^7.21.5", - "eslint-config-airbnb-typescript": "^16.1.0", - "eslint-config-prettier": "^8.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.32.2", - "prettier": "^2.0.0", - "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react": "^4.2.1", "eslint": "^8.57.0", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", + "prettier": "^2.0.0", + "sass": "^1.77.2", "typescript": "^5.2.2", "vite": "^5.2.0" } diff --git a/react-ui/public/logo.png b/react-ui/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4ee061e519860d12b8fb8bb044b1df4359f20d GIT binary patch literal 66912 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 literal 0 HcmV?d00001 diff --git a/react-ui/public/logo.svg b/react-ui/public/logo.svg new file mode 100644 index 000000000..b7f71bd90 --- /dev/null +++ b/react-ui/public/logo.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with Vectornator (http://vectornator.io/) --> +<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 113.4 212.625" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:vectornator="http://vectornator.io" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> +<radialGradient cx="170.235" cy="146.046" gradientTransform="matrix(1.00001 -8.65109e-05 8.65119e-05 1 -115.465 -116.986)" gradientUnits="userSpaceOnUse" id="RadialGradient" r="217.591"> +<stop offset="0" stop-color="#c456f7"/> +<stop offset="1" stop-color="#34054a"/> +</radialGradient> +<filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="209.692" id="Filter" width="111.957" x="0.722269" y="2.46642"> +<feDropShadow dx="-4.37114e-08" dy="1" flood-color="#050505" flood-opacity="1" in="SourceGraphic" result="Shadow" stdDeviation="1"/> +</filter> +</defs> +<g id="Layer-1" vectornator:layerName="Layer 1"> +<path d="M35.1413 3.47016L35.1416 6.93891L27.1415 6.93961L27.1464 63.3771C21.6096 65.0011 16.4869 67.0445 12.2717 69.6596C-9.35807 83.0789 12.5182 123.232 12.5264 123.222C12.5341 123.213 12.5498 123.2 12.5576 123.191C13.1518 124.609 14.5144 125.761 16.5579 126.534C18.7737 127.372 21.8204 127.855 26.8082 128.408C25.0644 132.318 24.4639 137.732 25.3409 144.846C26.0816 150.854 28.2327 155.309 32.5924 161.533C32.9615 162.06 34.1761 163.796 34.3427 164.033C35.013 164.984 35.5416 165.705 35.9991 166.408C38.1084 169.647 39.1319 172.149 39.3124 174.814C39.3701 175.665 39.3355 180.513 39.251 187.751C39.2362 189.024 39.0999 200.614 39.0959 200.907C37.7122 201.653 36.7523 203.069 36.7525 204.751C36.7527 207.19 38.7205 209.157 41.1591 209.157C43.5978 209.157 45.5653 207.189 45.5651 204.751C45.5649 203.019 44.5477 201.568 43.096 200.844C43.1023 200.341 43.2363 189.045 43.2511 187.782C43.3388 180.268 43.3816 175.583 43.3124 174.563C43.0775 171.096 41.7912 168.012 39.3427 164.251C38.854 163.5 38.3197 162.708 37.6237 161.72C37.4507 161.474 36.2342 159.766 35.8735 159.251C31.8564 153.517 29.9529 149.563 29.3096 144.346C28.2621 135.848 29.4895 130.5 32.027 127.533C32.6413 126.815 33.2789 126.306 33.9019 125.97C34.2334 125.792 34.4442 125.7 34.4956 125.689C35.5735 125.448 36.2365 124.392 35.9954 123.314C35.7543 122.236 34.6982 121.542 33.6202 121.783C33.2264 121.871 32.6655 122.078 31.9953 122.439C31.0669 122.939 30.1635 123.734 29.3079 124.658C23.0392 124.019 20.0922 123.577 17.9951 122.784C16.1482 122.086 15.9773 121.63 16.7137 120.347C25.511 115.923 43.9287 113.157 55.0885 113.156C63.8081 113.155 79.7952 116.873 90.4333 119.622C93.9977 120.542 94.7294 120.755 96.621 121.277C94.2649 123.034 89.4439 124.738 83.3087 125.247C83.0835 125.266 82.9434 125.443 82.7462 125.529C82.6074 125.348 82.5171 125.106 82.3711 124.935C81.4271 123.831 80.3863 122.999 79.3396 122.435C78.6693 122.074 78.1085 121.867 77.7145 121.779C76.6365 121.538 75.5805 122.233 75.3396 123.31C75.0987 124.388 75.7619 125.444 76.8399 125.685C76.8913 125.697 77.1021 125.788 77.4337 125.967C78.0567 126.302 78.6942 126.81 79.3088 127.529C81.8468 130.496 83.0751 135.844 82.029 144.341C81.3867 149.559 79.4839 153.513 75.4678 159.248C75.1071 159.763 73.8909 161.471 73.7179 161.717C73.0221 162.705 72.488 163.498 71.9994 164.248C69.5516 168.009 68.2658 171.094 68.0315 174.561C67.9625 175.581 68.0061 180.266 68.0951 187.78C68.1102 189.055 68.2793 200.673 68.2838 200.967C66.9421 201.725 66.0027 203.098 66.0028 204.749C66.0031 207.187 67.9709 209.155 70.4095 209.155C72.8481 209.154 74.8156 207.187 74.8154 204.748C74.8153 202.975 73.7598 201.482 72.2526 200.779C72.2461 200.277 72.1101 189.009 72.0952 187.748C72.0095 180.511 71.974 175.662 72.0316 174.811C72.2116 172.146 73.2659 169.644 75.3746 166.404C75.8321 165.701 76.3292 164.981 76.9994 164.029C77.1659 163.793 78.3803 162.056 78.7492 161.529C83.1079 155.305 85.2582 150.849 85.9979 144.841C86.8306 138.077 86.2654 132.917 84.7153 129.06C93.073 128.178 99.944 125.471 101.777 121.527C105.258 116.592 120.674 81.4184 100.46 69.1833C96.4145 66.7344 91.6503 64.7196 86.3971 63.1845L86.3922 6.93448L78.3609 6.93517L78.3606 3.46642L35.1413 3.47016ZM31.1419 10.9393L39.1107 10.9386L39.3309 27.9386C39.3406 28.6841 39.9605 29.2606 40.7061 29.2509C41.4516 29.2413 42.0593 28.6214 42.0497 27.8758L41.7983 10.9383L44.517 10.9381L44.7998 27.9381C44.8108 28.6836 45.3981 29.2615 46.1436 29.2505C46.8892 29.2394 47.4983 28.6209 47.4873 27.8753L47.2358 10.9379L49.9546 10.9376L50.2061 27.9376C50.2169 28.6831 50.8357 29.2608 51.5812 29.25C52.3267 29.2392 52.9044 28.6203 52.8936 27.8749L52.6421 10.9374L55.3609 10.9372L55.6124 27.9371C55.623 28.6827 56.242 29.2601 56.9875 29.2495C57.733 29.2389 58.3418 28.6199 58.3312 27.8744L58.0797 10.9369L60.8297 10.9367L61.05 27.9367C61.0546 28.3094 61.2147 28.6381 61.4563 28.8741C61.6979 29.1102 62.0211 29.2537 62.3938 29.2491C63.1394 29.2398 63.7468 28.6194 63.7375 27.8739L63.5173 10.9365L66.2986 10.9362L66.4875 27.905C66.4957 28.6505 67.1171 29.2568 67.8627 29.2486C68.6082 29.2404 69.1834 28.6503 69.1751 27.9047L68.9861 10.936L71.7674 10.9357L71.9564 27.9357C71.9605 28.3085 72.1132 28.6372 72.3627 28.8732C72.6122 29.1091 72.9587 29.2523 73.3315 29.2481C74.077 29.2398 74.6833 28.6498 74.6751 27.9042L74.4862 10.9355L82.3925 10.9348L82.3969 62.2473C78.1953 61.2363 73.8195 60.4151 69.2716 59.936L69.0841 59.936L69.0846 65.9672L62.3352 73.3116L62.211 82.5928L62.212 94.7803L56.5244 94.7808L50.3056 94.7814L50.2733 82.9376L50.1163 73.3126L43.1468 65.8132L43.1463 60.0945L31.1463 62.3455L31.1419 10.9393ZM46.0197 41.188L45.9904 64.3755L52.9599 71.8749L53.1492 91.9374L59.368 91.9368L59.5225 71.8743L66.2407 64.5612L66.2387 41.3425L46.0197 41.188ZM45.5578 121.282C45.0484 121.232 44.5158 121.369 44.0891 121.719C43.2356 122.421 43.1382 123.71 43.8394 124.563C43.8712 124.602 43.9181 124.67 44.0269 124.813C44.2163 125.062 44.4521 125.354 44.6832 125.688C45.3494 126.65 45.998 127.755 46.621 128.938C48.9603 133.379 50.0248 137.836 49.1222 141.875C48.4351 144.95 46.6061 147.711 43.4353 150.126C43.1568 150.338 42.1644 150.942 40.7792 151.751C40.6905 151.803 37.4839 153.662 37.4356 153.689C36.4728 154.23 36.1131 155.445 36.6545 156.408C37.1959 157.37 38.4106 157.699 39.3734 157.157C39.4251 157.128 42.7199 155.272 42.8108 155.22C44.3781 154.304 45.4057 153.669 45.8731 153.313C49.7829 150.336 52.1324 146.76 53.0285 142.75C54.1746 137.622 52.9238 132.266 50.1834 127.063C49.4811 125.729 48.7181 124.526 47.9643 123.438C47.5056 122.775 47.1244 122.271 46.9017 122C46.5511 121.574 46.0673 121.332 45.5578 121.282ZM65.7769 121.28C65.2675 121.33 64.7837 121.572 64.4331 121.999C64.2105 122.27 63.8293 122.774 63.3708 123.436C62.6172 124.525 61.8858 125.728 61.1835 127.062C58.444 132.265 57.163 137.621 58.3099 142.749C59.2067 146.759 61.5569 150.335 65.4671 153.311C65.9346 153.667 66.9935 154.302 68.5611 155.217C68.6519 155.27 71.9158 157.125 71.9675 157.154C72.9304 157.696 74.145 157.367 74.6862 156.404C75.2275 155.441 74.8676 154.227 73.9048 153.686C73.8565 153.658 70.6495 151.8 70.5608 151.748C69.1754 150.939 68.1829 150.336 67.9044 150.124C64.7332 147.71 62.9036 144.948 62.2161 141.874C61.3128 137.835 62.3766 133.378 64.715 128.936C65.3378 127.753 65.9862 126.649 66.6522 125.686C66.8833 125.352 67.1191 125.06 67.3084 124.811C67.4172 124.668 67.4953 124.6 67.5272 124.561C68.2282 123.708 68.0992 122.418 67.2457 121.717C66.8189 121.367 66.2862 121.23 65.7769 121.28ZM28.3735 160.064C27.8641 160.114 27.3492 160.357 26.9985 160.783C24.0604 164.358 22.5881 168.723 22.5621 174.253C22.5614 174.404 22.6311 200.839 22.627 200.877C21.1966 201.608 20.1896 203.036 20.1898 204.753C20.19 207.191 22.1578 209.159 24.5964 209.159C27.0351 209.158 29.0026 207.191 29.0024 204.752C29.0022 203.061 28.0235 201.65 26.627 200.908C26.6562 200.425 26.6538 197.055 26.6259 187.658C26.6229 186.662 26.5615 174.385 26.5622 174.252C26.584 169.618 27.7563 166.157 30.0925 163.314C30.7939 162.461 30.6644 161.203 29.811 160.502C29.3844 160.151 28.8829 160.015 28.3735 160.064ZM82.9679 160.06C82.4585 160.01 81.9571 160.147 81.5304 160.497C80.6772 161.199 80.5479 162.457 81.2494 163.31C83.5862 166.152 84.7591 169.613 84.7817 174.247C84.7823 174.378 84.7241 199.67 84.7527 200.841C83.3011 201.564 82.2529 203.015 82.253 204.747C82.2533 207.186 84.2524 209.153 86.691 209.153C89.1295 209.153 91.0971 207.185 91.0969 204.747C91.0967 203.049 90.1265 201.611 88.7215 200.872C88.7173 200.833 88.7318 194.753 88.7516 187.684C88.7544 186.688 88.7824 174.398 88.7817 174.247C88.7548 168.717 87.2817 164.353 84.343 160.778C83.9922 160.352 83.4774 160.109 82.9679 160.06Z" fill="url(#RadialGradient)" fill-rule="nonzero" filter="url(#Filter)" stroke="none" vectornator:shadowAngle="1.5708" vectornator:shadowColor="#050505" vectornator:shadowOffset="1" vectornator:shadowOpacity="1" vectornator:shadowRadius="2"/> +</g> +</svg> diff --git a/react-ui/public/logo192.png b/react-ui/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 diff --git a/react-ui/public/logo512.png b/react-ui/public/logo512.png deleted file mode 100644 index a4e47a6545bc15971f8f63fba70e4013df88a664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9664 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 Q-2sVvy85}Sb4q9e0RM_kJ^%m! diff --git a/react-ui/public/manifest.json b/react-ui/public/manifest.json index 080d6c77a..641e73d58 100644 --- a/react-ui/public/manifest.json +++ b/react-ui/public/manifest.json @@ -8,14 +8,9 @@ "type": "image/x-icon" }, { - "src": "logo192.png", + "src": "logo.png", "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" + "sizes": "400x400" } ], "start_url": ".", diff --git a/react-ui/src/i18n/config.js b/react-ui/src/i18n/config.js new file mode 100644 index 000000000..d43d93d47 --- /dev/null +++ b/react-ui/src/i18n/config.js @@ -0,0 +1,13 @@ +import i18next from "i18next"; + +import common_en from "./locales/en/translations.json"; + +i18next.init({ + interpolation: { escapeValue: false }, // React already does escaping + lng: 'en', // language to use + resources: { + en: { + common: common_en // 'common' is our custom namespace + }, + }, +}); \ No newline at end of file diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json new file mode 100644 index 000000000..0cc55e9af --- /dev/null +++ b/react-ui/src/i18n/locales/en/translations.json @@ -0,0 +1,14 @@ +{ + "global": { + "form": { + "submit": "Submit" + } + }, + + "login": { + "form": { + "username": "Username", + "password": "Password" + } + } +} \ No newline at end of file diff --git a/react-ui/src/index.css b/react-ui/src/index.scss similarity index 73% rename from react-ui/src/index.css rename to react-ui/src/index.scss index ec2585e8c..cdcaaa281 100644 --- a/react-ui/src/index.css +++ b/react-ui/src/index.scss @@ -1,3 +1,5 @@ +@import './style/style.scss'; + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', @@ -5,9 +7,7 @@ body { sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -} -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; + + background-color: map-get($theme-colors, bg-primary) !important; } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 4d179a46b..db0b82766 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,16 +1,41 @@ import React from 'react' import ReactDOM, { Container } from 'react-dom/client' -import './index.css' -import App from './pages/landingpage/App' +import { + Outlet, + Route, + RouterProvider, + createBrowserRouter, + createRoutesFromElements, +} from 'react-router-dom' +import './index.scss' +import Landingpage from './pages/landingpage/landingpage' +import LoginPage from './pages/login/login' import initStore from './stores/api.store' -initStore({}) +import './i18n/config' +import { I18nextProvider } from 'react-i18next' +import i18next from 'i18next' + +initStore() const root = ReactDOM.createRoot(document.getElementById('root') as Container) +// create a proper routing +const router = createBrowserRouter( + createRoutesFromElements( + <> + <Route element={<Outlet />}> + <Route path="/" element={<Landingpage />} /> + <Route path="/login" element={<LoginPage />} /> + </Route> + </> + ) +) + root.render( <React.StrictMode> - <App /> + <I18nextProvider i18n={i18next}> + <RouterProvider router={router} /> + </I18nextProvider> </React.StrictMode> ) - diff --git a/react-ui/src/pages/landingpage/App.css b/react-ui/src/pages/landingpage/landingpage.scss similarity index 92% rename from react-ui/src/pages/landingpage/App.css rename to react-ui/src/pages/landingpage/landingpage.scss index bd7fb253b..a46d992e7 100644 --- a/react-ui/src/pages/landingpage/App.css +++ b/react-ui/src/pages/landingpage/landingpage.scss @@ -1,4 +1,3 @@ -@import 'bootstrap/dist/css/bootstrap.min.css'; .App { text-align: center; diff --git a/react-ui/src/pages/landingpage/landingpage.test.tsx b/react-ui/src/pages/landingpage/landingpage.test.tsx new file mode 100644 index 000000000..b3f1713e2 --- /dev/null +++ b/react-ui/src/pages/landingpage/landingpage.test.tsx @@ -0,0 +1,9 @@ +import { render, screen } from '@testing-library/react' +import Landingpage from './landingpage' +import React from 'react' + +test('renders learn react link', () => { + render(<Landingpage />) + const linkElement = screen.getByText(/learn react/i) + expect(linkElement).toBeInTheDocument() +}) diff --git a/react-ui/src/pages/landingpage/App.tsx b/react-ui/src/pages/landingpage/landingpage.tsx similarity index 88% rename from react-ui/src/pages/landingpage/App.tsx rename to react-ui/src/pages/landingpage/landingpage.tsx index 77f66b4bc..b8cb71bc0 100644 --- a/react-ui/src/pages/landingpage/App.tsx +++ b/react-ui/src/pages/landingpage/landingpage.tsx @@ -1,9 +1,7 @@ -import './App.css' +import './landingpage.scss' import logo from '@assets/logo.svg' -import React from 'react' - -function App() { +function Landingpage() { return ( <div className="App"> <header className="App-header"> @@ -24,4 +22,4 @@ function App() { ) } -export default App +export default Landingpage diff --git a/react-ui/src/pages/login/login.scss b/react-ui/src/pages/login/login.scss new file mode 100644 index 000000000..27295346c --- /dev/null +++ b/react-ui/src/pages/login/login.scss @@ -0,0 +1,8 @@ +@import '/node_modules/bootstrap/scss/bootstrap-grid.scss'; + +@include media-breakpoint-up(md) { + .login-container { + padding-bottom: 15em; + } + +} \ No newline at end of file diff --git a/react-ui/src/pages/landingpage/App.test.tsx b/react-ui/src/pages/login/login.test.tsx similarity index 90% rename from react-ui/src/pages/landingpage/App.test.tsx rename to react-ui/src/pages/login/login.test.tsx index 103072bab..7bdf84514 100644 --- a/react-ui/src/pages/landingpage/App.test.tsx +++ b/react-ui/src/pages/login/login.test.tsx @@ -1,5 +1,5 @@ import { render, screen } from '@testing-library/react' -import App from './App' +import App from './login' import React from 'react' test('renders learn react link', () => { diff --git a/react-ui/src/pages/login/login.tsx b/react-ui/src/pages/login/login.tsx new file mode 100644 index 000000000..69d411b62 --- /dev/null +++ b/react-ui/src/pages/login/login.tsx @@ -0,0 +1,76 @@ +import { Button, Col, Container, Form, Image, Row } from 'react-bootstrap' +import { useTranslation } from 'react-i18next' +import './login.scss' + +import logo from '@assets/logo.svg' +import React, { useRef } from 'react' +import { RbacLoginRequest } from '@api' +import { AuthServiceApiRequestFactory } from '@api/apis/AuthServiceApi' +import { createConfiguration } from '@api/configuration'; + +const LoginPage = () => { + const { t } = useTranslation('common') + const usernameRef = useRef<HTMLInputElement>(null) + const passwordRef = useRef<HTMLInputElement>(null) + + const login = (event: React.FormEvent<HTMLFormElement>) => { + event.preventDefault() + + const username = usernameRef.current?.value + const password = passwordRef.current?.value + + const configuration = createConfiguration() + const client = new AuthServiceApiRequestFactory(configuration) + + const payload: RbacLoginRequest = { + username: username, + pwd: password, + timestamp: new Date().toString(), + } + + client.authServiceLogin(payload).then(response => { + console.log(response) + }); + } + + return ( + <Container className="vh-100 d-flex flex-column justify-content-center login-container"> + <Row className="align-items-center"> + <Image src={logo} alt="logo" height={150} /> + </Row> + <Row className="mt-2 justify-content-center"> + <Col md={6} sm={10} className="c-box p-4"> + <h1 className="text-center h2">goSDN - Web</h1> + <Form className="mt-4" onSubmit={login}> + <Form.Group + className="mb-3" + controlId="loginForm.username" + > + <Form.Label>{t('login.form.username')}</Form.Label> + <Form.Control + type="text" + ref={usernameRef} + /> + </Form.Group> + <Form.Group + className="mb-3" + controlId="loginForm.pasword" + > + <Form.Label>{t('login.form.password')}</Form.Label> + <Form.Control type="password" ref={passwordRef} /> + </Form.Group> + <Button + variant="primary" + type="submit" + className="w-100 mt-3" + > + {t('global.form.submit')} + </Button> + </Form> + </Col> + </Row> + </Container> + ) +} + +export default LoginPage diff --git a/react-ui/src/router.tsx b/react-ui/src/router.tsx new file mode 100644 index 000000000..b67113bd7 --- /dev/null +++ b/react-ui/src/router.tsx @@ -0,0 +1,169 @@ +import { + BrowserRouter as Router, + Route, + Link, + useLocation, + Routes +} from "react-router-dom"; + +// This example has 3 pages: a public page, a protected +// page, and a login screen. In order to see the protected +// page, you must first login. Pretty standard stuff. +// +// First, visit the public page. Then, visit the protected +// page. You're not yet logged in, so you are redirected +// to the login page. After you login, you are redirected +// back to the protected page. +// +// Notice the URL change each time. If you click the back +// button at this point, would you expect to go back to the +// login page? No! You're already logged in. Try it out, +// and you'll see you go back to the page you visited +// just *before* logging in, the public page. + +export default function AuthExample() { + return ( + <ProvideAuth> + <Router> + <div> + <AuthButton /> + + <ul> + <li> + <Link to="/public">Public Page</Link> + </li> + <li> + <Link to="/protected">Protected Page</Link> + </li> + </ul> + + <Routes> + <Route path="/public"> + <PublicPage /> + </Route> + <Route path="/login"> + <LoginPage /> + </Route> + <PrivateRoute path="/protected"> + <ProtectedPage /> + </PrivateRoute> + </Routes> + </div> + </Router> + </ProvideAuth> + ); +} + +/** For more details on + * `authContext`, `ProvideAuth`, `useAuth` and `useProvideAuth` + * refer to: https://usehooks.com/useAuth/ + */ +const authContext = createContext(); + +function ProvideAuth({ children }) { + const auth = useProvideAuth(); + return ( + <authContext.Provider value={auth}> + {children} + </authContext.Provider> + ); +} + +function useAuth() { + return useContext(authContext); +} + +function useProvideAuth() { + const [user, setUser] = useState(null); + + const signin = cb => { + return fakeAuth.signin(() => { + setUser("user"); + cb(); + }); + }; + + const signout = cb => { + return fakeAuth.signout(() => { + setUser(null); + cb(); + }); + }; + + return { + user, + signin, + signout + }; +} + +function AuthButton() { + let history = useHistory(); + let auth = useAuth(); + + return auth.user ? ( + <p> + Welcome!{" "} + <button + onClick={() => { + auth.signout(() => history.push("/")); + }} + > + Sign out + </button> + </p> + ) : ( + <p>You are not logged in.</p> + ); +} + +// A wrapper for <Route> that redirects to the login +// screen if you're not yet authenticated. +function PrivateRoute({ children, ...rest }) { + let auth = useAuth(); + return ( + <Route + {...rest} + render={({ location }) => + auth.user ? ( + children + ) : ( + <Redirect + to={{ + pathname: "/login", + state: { from: location } + }} + /> + ) + } + /> + ); +} + +function PublicPage() { + return <h3>Public</h3>; +} + +function ProtectedPage() { + return <h3>Protected</h3>; +} + +function LoginPage() { + let history = useHistory(); + let location = useLocation(); + let auth = useAuth(); + + let { from } = location.state || { from: { pathname: "/" } }; + let login = () => { + auth.signin(() => { + history.replace(from); + }); + }; + + return ( + <div> + <p>You must log in to view the page at {from.pathname}</p> + <button onClick={login}>Log in</button> + </div> + ); +} \ No newline at end of file diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index bc400dfae..2ae49c724 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -1,17 +1,18 @@ import { combineReducers } from 'redux' -import mneReducer from './slices/example.reducer' - +import userReducer from './slices/user.reducer' import { configureStore } from '@reduxjs/toolkit' const getReducers = () => { return combineReducers({ - mneReducer, + userReducer, }) } -const store = configureStore({ - reducer: getReducers(), -}) +const initStore = () => { + return configureStore({ + reducer: getReducers(), + }) +} -export type RootState = ReturnType<typeof store.getState> -export default store +//export type RootState = ReturnType<typeof store.getState> +export default initStore diff --git a/react-ui/src/stores/slices/example.reducer.ts b/react-ui/src/stores/slices/example.reducer.ts deleted file mode 100644 index 5a343e4a2..000000000 --- a/react-ui/src/stores/slices/example.reducer.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit' - -const mneSlice = createSlice({ - name: 'test', - initialState: 0, - reducers: { - increment: (state, action: PayloadAction<number>) => - state + action.payload, - }, -}) - -const mneReducer = mneSlice.reducer -export default mneReducer diff --git a/react-ui/src/stores/slices/user.reducer.ts b/react-ui/src/stores/slices/user.reducer.ts new file mode 100644 index 000000000..8f0b49812 --- /dev/null +++ b/react-ui/src/stores/slices/user.reducer.ts @@ -0,0 +1,31 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit' +import { RootState } from '@reduxjs/toolkit/query'; +import { RbacUser } from 'src/api' + +export type UserType = RbacUser; + + +interface UserState { + user: UserType | undefined +} + + +const initialState: UserState = { + user: undefined +} + + +const userSlice = createSlice({ + name: 'user', + initialState, + reducers: { + set: (state, action: PayloadAction<UserType>) => + {state.user = action.payload}, + }, +}) + +export const { set } = userSlice.actions + +//export const getUser = (state: RootState) => state.counter.value + +export default userSlice.reducer diff --git a/react-ui/src/style/box.scss b/react-ui/src/style/box.scss new file mode 100644 index 000000000..e2782bca2 --- /dev/null +++ b/react-ui/src/style/box.scss @@ -0,0 +1,8 @@ +.c-box { + background-color: white; + + border-radius: 10px; + box-shadow: 0px 4px 4px rgba(0,0,0, .35); + + padding: 5px; +} \ No newline at end of file diff --git a/react-ui/src/style/style.scss b/react-ui/src/style/style.scss new file mode 100644 index 000000000..2d8649fd4 --- /dev/null +++ b/react-ui/src/style/style.scss @@ -0,0 +1,10 @@ +@import './box.scss'; +@import './utils.scss'; + + +$theme-colors: ( + 'primary': #b350e0, + 'bg-primary': #E1E1E1 + ); + + @import '/node_modules/bootstrap/scss/bootstrap'; \ No newline at end of file diff --git a/react-ui/src/style/utils.scss b/react-ui/src/style/utils.scss new file mode 100644 index 000000000..9485a52c6 --- /dev/null +++ b/react-ui/src/style/utils.scss @@ -0,0 +1,3 @@ +.vh-100 { + height: 100vh !important; +} \ No newline at end of file diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 1d185143f..aa7289071 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -23,8 +23,14 @@ "baseUrl": ".", "paths": { "@assets/*": ["assets/*"], + "@api/*": ["src/api/*"], + "@api": ["src/api"], } }, - "include": ["src"], + "include": [ + "src/**/*.d.ts", + "src/**/*.ts", + "src/**/*.tsx", + ], "references": [{ "path": "./tsconfig.node.json" }] } \ No newline at end of file diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 3454c14e0..bf2ad319d 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -1,6 +1,7 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' + export default defineConfig({ plugins: [react()], server: { @@ -9,6 +10,7 @@ export default defineConfig({ resolve: { alias: { '@assets': '/assets', + '@api': '/src/api', }, }, // build: { diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 788a45858..e37ab2bee 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -1287,6 +1287,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.23.9": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.6.tgz#5b76eb89ad45e2e4a0a8db54c456251469a3358e" + integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" @@ -2014,6 +2021,11 @@ redux-thunk "^3.1.0" reselect "^5.1.0" +"@remix-run/router@1.16.1": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" + integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== + "@restart/hooks@^0.4.9": version "0.4.16" resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" @@ -3775,7 +3787,7 @@ check-types@^11.2.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== -chokidar@^3.4.2, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -5781,6 +5793,13 @@ html-minifier-terser@^6.0.2: relateurl "^0.2.7" terser "^5.10.0" +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + html-webpack-plugin@^5.5.0: version "5.6.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" @@ -5875,6 +5894,13 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +i18next@^23.11.5: + version "23.11.5" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" + integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== + dependencies: + "@babel/runtime" "^7.23.2" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5921,6 +5947,11 @@ immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== +immutable@^4.0.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" + integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== + import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -8607,6 +8638,14 @@ react-error-overlay@^6.0.11: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== +react-i18next@^14.1.2: + version "14.1.2" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.2.tgz#cd57a755f25a32a5fcc3dbe546cf3cc62b4f3ebd" + integrity sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg== + dependencies: + "@babel/runtime" "^7.23.9" + html-parse-stringify "^3.0.1" + react-is@^16.13.1, react-is@^16.3.2: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -8645,6 +8684,21 @@ react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== +react-router-dom@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" + integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== + dependencies: + "@remix-run/router" "1.16.1" + react-router "6.23.1" + +react-router@6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9" + integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== + dependencies: + "@remix-run/router" "1.16.1" + react-scripts@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" @@ -9054,6 +9108,15 @@ sass-loader@^12.3.0: klona "^2.0.4" neo-async "^2.6.2" +sass@^1.77.2: + version "1.77.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa" + integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -9287,7 +9350,7 @@ source-list-map@^2.0.0, source-list-map@^2.0.1: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.1, source-map-js@^1.2.0: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== @@ -9421,16 +9484,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - 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" - -string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9517,14 +9571,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10151,6 +10198,11 @@ vite@^5.2.0: optionalDependencies: fsevents "~2.3.3" +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -10607,16 +10659,7 @@ workbox-window@6.6.1: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== -- GitLab From 8d8b9465501ba9bba1f341067d2bc6819383abf2 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 28 May 2024 14:58:47 +0200 Subject: [PATCH 05/78] add german as language --- react-ui/README.md | 2 ++ react-ui/docs/development.md | 25 +++++++++++++++++++ react-ui/src/i18n/config.js | 10 +++++--- .../src/i18n/locales/de/translations.json | 14 +++++++++++ react-ui/src/pages/login/login.tsx | 25 +++++++++++-------- 5 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 react-ui/docs/development.md create mode 100644 react-ui/src/i18n/locales/de/translations.json diff --git a/react-ui/README.md b/react-ui/README.md index b6c8b0ba1..c9208ec09 100644 --- a/react-ui/README.md +++ b/react-ui/README.md @@ -7,5 +7,7 @@ This is the UI for the goSDN project. It's a webapp written in react ### Requirements - Docker + + ### Author Matthias Feyll \ No newline at end of file diff --git a/react-ui/docs/development.md b/react-ui/docs/development.md new file mode 100644 index 000000000..819b1dfd7 --- /dev/null +++ b/react-ui/docs/development.md @@ -0,0 +1,25 @@ +## Development +### Technologies +The web app uses several technologies: +* JS-Framework: **React js** +* State management: **Redux** +* Component Libray: **React-Bootstrap** +* CSS-Framework: **Bootstrap** +* Bundler: **Vite** + +Additionally the web app has several core features that should be considered: +* multi languages (i18n): + * English + * German + + +### API +The API to communicate is getting generated with: + +``` +yarn build::api +``` + +It generates a restful API in the `/src/api/` folder. + +We need to proxy the incoming request to the API-Gateway from goSDN. \ No newline at end of file diff --git a/react-ui/src/i18n/config.js b/react-ui/src/i18n/config.js index d43d93d47..398603ff7 100644 --- a/react-ui/src/i18n/config.js +++ b/react-ui/src/i18n/config.js @@ -1,13 +1,17 @@ import i18next from "i18next"; import common_en from "./locales/en/translations.json"; +import common_de from "./locales/de/translations.json"; i18next.init({ - interpolation: { escapeValue: false }, // React already does escaping - lng: 'en', // language to use + interpolation: { escapeValue: false }, + lng: 'en', resources: { en: { - common: common_en // 'common' is our custom namespace + common: common_en }, + de: { + common: common_de + } }, }); \ No newline at end of file diff --git a/react-ui/src/i18n/locales/de/translations.json b/react-ui/src/i18n/locales/de/translations.json new file mode 100644 index 000000000..0c6599156 --- /dev/null +++ b/react-ui/src/i18n/locales/de/translations.json @@ -0,0 +1,14 @@ +{ + "global": { + "form": { + "submit": "Abschicken" + } + }, + + "login": { + "form": { + "username": "Benutzername", + "password": "Passwort" + } + } +} \ No newline at end of file diff --git a/react-ui/src/pages/login/login.tsx b/react-ui/src/pages/login/login.tsx index 69d411b62..66b78b546 100644 --- a/react-ui/src/pages/login/login.tsx +++ b/react-ui/src/pages/login/login.tsx @@ -2,11 +2,11 @@ import { Button, Col, Container, Form, Image, Row } from 'react-bootstrap' import { useTranslation } from 'react-i18next' import './login.scss' +import { AuthServiceApiAuthServiceLoginRequest } from '@api/types/ObjectParamAPI' +import { PromiseAuthServiceApi } from '@api/types/PromiseAPI' import logo from '@assets/logo.svg' import React, { useRef } from 'react' -import { RbacLoginRequest } from '@api' -import { AuthServiceApiRequestFactory } from '@api/apis/AuthServiceApi' -import { createConfiguration } from '@api/configuration'; +import { createConfiguration } from '../../api/configuration' const LoginPage = () => { const { t } = useTranslation('common') @@ -19,18 +19,23 @@ const LoginPage = () => { const username = usernameRef.current?.value const password = passwordRef.current?.value - const configuration = createConfiguration() - const client = new AuthServiceApiRequestFactory(configuration) - const payload: RbacLoginRequest = { + const configuration = createConfiguration(); + const apiInstance = new PromiseAuthServiceApi(configuration); + + // TODO check values + const body: AuthServiceApiAuthServiceLoginRequest = { + body: { username: username, pwd: password, timestamp: new Date().toString(), - } + }, + }; + + apiInstance.authServiceLogin(body).then((data:any) => { + console.log('API called successfully. Returned data: ' + data); + }).catch((error:any) => console.error(error)); - client.authServiceLogin(payload).then(response => { - console.log(response) - }); } return ( -- GitLab From 99d01ee7bb3a7505f9e2ee2a26178ecf0d953f2b Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 4 Jun 2024 11:57:35 +0200 Subject: [PATCH 06/78] wip cors implementation --- react-ui/package.json | 1 + react-ui/scripts/build-api.sh | 2 +- react-ui/scripts/openapitools.json | 27 +++++++++++++++++++++++ react-ui/src/pages/login/login.tsx | 35 ++++++++++++++++-------------- react-ui/src/setupProxy.js | 11 ++++++++++ react-ui/tsconfig.json | 5 ++--- react-ui/tsconfig.node.json | 6 +++-- react-ui/vite.config.mjs | 29 ++++++++++++++++++++----- 8 files changed, 89 insertions(+), 27 deletions(-) create mode 100644 react-ui/scripts/openapitools.json create mode 100644 react-ui/src/setupProxy.js diff --git a/react-ui/package.json b/react-ui/package.json index 16a92a477..5d920f15f 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -45,6 +45,7 @@ "last 1 safari version" ] }, + "proxy": "http://localhost:55055", "devDependencies": { "@babel/runtime": "^7.21.5", "@types/react": "^18.2.66", diff --git a/react-ui/scripts/build-api.sh b/react-ui/scripts/build-api.sh index 5716ba969..76454bb06 100755 --- a/react-ui/scripts/build-api.sh +++ b/react-ui/scripts/build-api.sh @@ -6,5 +6,5 @@ API_PATH=/api/openapiv2 OUTPUT=${PROJECT_NAME}/src/api -docker run -it --rm \ +docker run -i --rm \ -v ${PROJECT_ROOT}:/local openapitools/openapi-generator-cli generate -i /local${API_PATH}/gosdn_northbound.swagger.json -g typescript -o /local/${OUTPUT} \ No newline at end of file diff --git a/react-ui/scripts/openapitools.json b/react-ui/scripts/openapitools.json new file mode 100644 index 000000000..33e1ba3d4 --- /dev/null +++ b/react-ui/scripts/openapitools.json @@ -0,0 +1,27 @@ +{ + "$schema": "../node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "4.3.1", + "storageDir": "~/my/custom/storage/dir", // optional + "generators": { // optional + "v2.0": { // any name you like (just printed to the console log or reference it using --generator-key) + "generatorName": "typescript-angular", + "output": "#{cwd}/output/v2.0/#{ext}/#{name}", + "glob": "examples/v2.0/{json,yaml}/*.{json,yaml}", + "additionalProperties": { + "ngVersion": "6.1.7", + "npmName": "restClient", + "supportsES6": "true", + "npmVersion": "6.9.0", + "withInterfaces": true + } + }, + "v3.0": { // any name you like (just printed to the console log or reference it using --generator-key) + "generatorName": "typescript-fetch", + "output": "#{cwd}/output/v3.0/#{ext}/#{name}", + "glob": "examples/v3.0/petstore.{json,yaml}" + } + } + } + } \ No newline at end of file diff --git a/react-ui/src/pages/login/login.tsx b/react-ui/src/pages/login/login.tsx index 66b78b546..7eb213e78 100644 --- a/react-ui/src/pages/login/login.tsx +++ b/react-ui/src/pages/login/login.tsx @@ -3,37 +3,40 @@ import { useTranslation } from 'react-i18next' import './login.scss' import { AuthServiceApiAuthServiceLoginRequest } from '@api/types/ObjectParamAPI' -import { PromiseAuthServiceApi } from '@api/types/PromiseAPI' import logo from '@assets/logo.svg' import React, { useRef } from 'react' -import { createConfiguration } from '../../api/configuration' +import { AuthServiceApi, RbacLoginRequest, RbacLoginResponse, createConfiguration } from '@api/index' const LoginPage = () => { const { t } = useTranslation('common') const usernameRef = useRef<HTMLInputElement>(null) const passwordRef = useRef<HTMLInputElement>(null) - const login = (event: React.FormEvent<HTMLFormElement>) => { - event.preventDefault() - + const getAuthPayload = (): RbacLoginRequest => { const username = usernameRef.current?.value const password = passwordRef.current?.value - - const configuration = createConfiguration(); - const apiInstance = new PromiseAuthServiceApi(configuration); - - // TODO check values - const body: AuthServiceApiAuthServiceLoginRequest = { - body: { + // TODO check values + const payload: RbacLoginRequest = { username: username, pwd: password, timestamp: new Date().toString(), - }, - }; + } + + return payload; + } + + const login = (event: React.FormEvent<HTMLFormElement>) => { + event.preventDefault() + + const configuration = createConfiguration(); + const apiInstance = new AuthServiceApi(configuration); + + const payload = getAuthPayload(); + - apiInstance.authServiceLogin(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); + apiInstance.authServiceLogin(payload).then((response:RbacLoginResponse) => { + console.log('API called successfully. Returned data: ' + response); }).catch((error:any) => console.error(error)); } diff --git a/react-ui/src/setupProxy.js b/react-ui/src/setupProxy.js new file mode 100644 index 000000000..afeb740de --- /dev/null +++ b/react-ui/src/setupProxy.js @@ -0,0 +1,11 @@ +const { createProxyMiddleware } = require('http-proxy-middleware'); + +module.exports = function(app) { + app.use( + '/api', + createProxyMiddleware({ + target: 'http://127.0.0.1:8089', + changeOrigin: true, + }) + ); +}; \ No newline at end of file diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index aa7289071..977976c0f 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -24,7 +24,6 @@ "paths": { "@assets/*": ["assets/*"], "@api/*": ["src/api/*"], - "@api": ["src/api"], } }, "include": [ @@ -32,5 +31,5 @@ "src/**/*.ts", "src/**/*.tsx", ], - "references": [{ "path": "./tsconfig.node.json" }] - } \ No newline at end of file + //"references": [{ "path": "./tsconfig.node.json" }] +} \ No newline at end of file diff --git a/react-ui/tsconfig.node.json b/react-ui/tsconfig.node.json index 97ede7ee6..d5ed4eaa8 100644 --- a/react-ui/tsconfig.node.json +++ b/react-ui/tsconfig.node.json @@ -7,5 +7,7 @@ "allowSyntheticDefaultImports": true, "strict": true }, - "include": ["vite.config.ts"] -} + "include": [ + "vite.config.ts" + ] +} \ No newline at end of file diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index bf2ad319d..7aa8ebc5a 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -5,7 +5,26 @@ import react from '@vitejs/plugin-react' export default defineConfig({ plugins: [react()], server: { - port: 3000, // Standardmäßig wird Port 3000 verwendet, kann aber angepasst werden + port: 3000, + proxy: { + '/api': { + target: 'https://localhost:8089', + changeOrigin: true, + secure: false, + ws: true, + configure: (proxy, _options) => { + proxy.on('error', (err, _req, _res) => { + console.log('proxy error', err); + }); + proxy.on('proxyReq', (proxyReq, req, _res) => { + console.log('Sending Request to the Target:', req.method, req.url); + }); + proxy.on('proxyRes', (proxyRes, req, _res) => { + console.log('Received Response from the Target:', proxyRes.statusCode, req.url); + }); + }, + } + } }, resolve: { alias: { @@ -13,8 +32,8 @@ export default defineConfig({ '@api': '/src/api', }, }, - // build: { - // outDir: 'dist', // Standardmäßiger Ausgabepfad für den Build - // sourcemap: true, // Source Maps für den Build aktivieren - // }, + + build: { + sourcemap: true, // Source Maps für den Build aktivieren + }, }); \ No newline at end of file -- GitLab From 5280eb2bcd3546abb89150488f6ab670e7d1f9b1 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 4 Jun 2024 17:34:01 +0200 Subject: [PATCH 07/78] added rtx query to redux --- react-ui/.gitignore | 2 +- react-ui/package.json | 4 +- react-ui/scripts/build-api.sh | 2 +- react-ui/scripts/openapi-config.json | 8 + react-ui/scripts/openapitools.json | 27 - react-ui/scripts/test.ts | 1208 ++++++++++++++++++++++++++ react-ui/src/index.tsx | 13 +- react-ui/src/pages/login/login.tsx | 31 +- react-ui/src/setupProxy.js | 11 - react-ui/src/stores/api.store.ts | 23 +- react-ui/src/stores/index.ts | 23 + react-ui/tsconfig.json | 2 +- react-ui/tsconfig.node.json | 2 +- react-ui/vite.config.mjs | 6 +- react-ui/yarn.lock | 297 ++++++- 15 files changed, 1570 insertions(+), 89 deletions(-) create mode 100644 react-ui/scripts/openapi-config.json delete mode 100644 react-ui/scripts/openapitools.json create mode 100644 react-ui/scripts/test.ts delete mode 100644 react-ui/src/setupProxy.js create mode 100644 react-ui/src/stores/index.ts diff --git a/react-ui/.gitignore b/react-ui/.gitignore index bccd6e591..e7d84c03a 100644 --- a/react-ui/.gitignore +++ b/react-ui/.gitignore @@ -9,7 +9,7 @@ /coverage # api -/src/api +/src/api/** # production /build diff --git a/react-ui/package.json b/react-ui/package.json index 5d920f15f..f2d15cd7c 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -23,7 +23,8 @@ "start": "vite", "build": "tsc && vite build", "test": "react-scripts test", - "build::api": "./scripts/build-api.sh", + "build::api_old": "./scripts/build-api.sh", + "build::api": "npx @rtk-query/codegen-openapi ./scripts/openapi-config.json", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "lint::fix": "eslint src --ext .js,.jsx,.ts,.tsx --fix" }, @@ -48,6 +49,7 @@ "proxy": "http://localhost:55055", "devDependencies": { "@babel/runtime": "^7.21.5", + "@rtk-query/codegen-openapi": "^1.2.0", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", diff --git a/react-ui/scripts/build-api.sh b/react-ui/scripts/build-api.sh index 76454bb06..710affc43 100755 --- a/react-ui/scripts/build-api.sh +++ b/react-ui/scripts/build-api.sh @@ -7,4 +7,4 @@ API_PATH=/api/openapiv2 OUTPUT=${PROJECT_NAME}/src/api docker run -i --rm \ - -v ${PROJECT_ROOT}:/local openapitools/openapi-generator-cli generate -i /local${API_PATH}/gosdn_northbound.swagger.json -g typescript -o /local/${OUTPUT} \ No newline at end of file + -v ${PROJECT_ROOT}:/local openapitools/openapi-generator-cli generate -i /local${API_PATH}/gosdn_northbound.swagger.json -g typescript-redux-query -o /local/${OUTPUT} \ No newline at end of file diff --git a/react-ui/scripts/openapi-config.json b/react-ui/scripts/openapi-config.json new file mode 100644 index 000000000..1aa05ba6e --- /dev/null +++ b/react-ui/scripts/openapi-config.json @@ -0,0 +1,8 @@ +{ + "schemaFile": "../../api/openapiv2/gosdn_northbound.swagger.json", + "apiFile": "../src/stores/api.store.ts", + "apiImport": "emptySplitApi", + "outputFile": "../src/api/api.ts", + "exportName": "api", + "hooks": true +} \ No newline at end of file diff --git a/react-ui/scripts/openapitools.json b/react-ui/scripts/openapitools.json deleted file mode 100644 index 33e1ba3d4..000000000 --- a/react-ui/scripts/openapitools.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "../node_modules/@openapitools/openapi-generator-cli/config.schema.json", - "spaces": 2, - "generator-cli": { - "version": "4.3.1", - "storageDir": "~/my/custom/storage/dir", // optional - "generators": { // optional - "v2.0": { // any name you like (just printed to the console log or reference it using --generator-key) - "generatorName": "typescript-angular", - "output": "#{cwd}/output/v2.0/#{ext}/#{name}", - "glob": "examples/v2.0/{json,yaml}/*.{json,yaml}", - "additionalProperties": { - "ngVersion": "6.1.7", - "npmName": "restClient", - "supportsES6": "true", - "npmVersion": "6.9.0", - "withInterfaces": true - } - }, - "v3.0": { // any name you like (just printed to the console log or reference it using --generator-key) - "generatorName": "typescript-fetch", - "output": "#{cwd}/output/v3.0/#{ext}/#{name}", - "glob": "examples/v3.0/petstore.{json,yaml}" - } - } - } - } \ No newline at end of file diff --git a/react-ui/scripts/test.ts b/react-ui/scripts/test.ts new file mode 100644 index 000000000..775438e48 --- /dev/null +++ b/react-ui/scripts/test.ts @@ -0,0 +1,1208 @@ +import { emptySplitApi as api } from '../src/stores/api.store' +const injectedRtkApi = api.injectEndpoints({ + endpoints: (build) => ({ + appServiceDeregister: build.mutation< + AppServiceDeregisterApiResponse, + AppServiceDeregisterApiArg + >({ + query: (queryArg) => ({ + url: `/deregister`, + method: 'POST', + body: queryArg.appAppDeregisterRequest, + }), + }), + configurationManagementServiceExportSdnConfig: build.query< + ConfigurationManagementServiceExportSdnConfigApiResponse, + ConfigurationManagementServiceExportSdnConfigApiArg + >({ + query: (queryArg) => ({ + url: `/export/${queryArg.pid}`, + params: { timestamp: queryArg.timestamp }, + }), + }), + configurationManagementServiceImportSdnConfig: build.mutation< + ConfigurationManagementServiceImportSdnConfigApiResponse, + ConfigurationManagementServiceImportSdnConfigApiArg + >({ + query: (queryArg) => ({ + url: `/import/${queryArg.pid}`, + method: 'POST', + params: { + timestamp: queryArg.timestamp, + sdnConfigData: queryArg.sdnConfigData, + }, + }), + }), + authServiceLogin: build.mutation< + AuthServiceLoginApiResponse, + AuthServiceLoginApiArg + >({ + query: (queryArg) => ({ + url: `/login`, + method: 'POST', + body: queryArg.rbacLoginRequest, + }), + }), + authServiceLogout: build.mutation< + AuthServiceLogoutApiResponse, + AuthServiceLogoutApiArg + >({ + query: (queryArg) => ({ + url: `/logout/${queryArg.username}`, + method: 'POST', + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceUpdate: build.mutation< + NetworkElementServiceUpdateApiResponse, + NetworkElementServiceUpdateApiArg + >({ + query: (queryArg) => ({ + url: `/network-element/update`, + method: 'POST', + body: queryArg.networkelementUpdateNetworkElementRequest, + }), + }), + pndServiceGetPnd: build.query< + PndServiceGetPndApiResponse, + PndServiceGetPndApiArg + >({ + query: (queryArg) => ({ + url: `/pnd/${queryArg.pid}`, + params: { timestamp: queryArg.timestamp }, + }), + }), + pndServiceGetPndList: build.query< + PndServiceGetPndListApiResponse, + PndServiceGetPndListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds`, + params: { timestamp: queryArg.timestamp }, + }), + }), + pndServiceCreatePndList: build.mutation< + PndServiceCreatePndListApiResponse, + PndServiceCreatePndListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds`, + method: 'POST', + body: queryArg.pndCreatePndListRequest, + }), + }), + pndServiceDeletePnd: build.mutation< + PndServiceDeletePndApiResponse, + PndServiceDeletePndApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceGetChangeList: build.query< + NetworkElementServiceGetChangeListApiResponse, + NetworkElementServiceGetChangeListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/changes`, + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceSetChangeList: build.mutation< + NetworkElementServiceSetChangeListApiResponse, + NetworkElementServiceSetChangeListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/changes`, + method: 'POST', + body: queryArg.networkElementServiceSetChangeListBody, + }), + }), + networkElementServiceGetChange: build.query< + NetworkElementServiceGetChangeApiResponse, + NetworkElementServiceGetChangeApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/changes/${queryArg.cuid}`, + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceGet: build.query< + NetworkElementServiceGetApiResponse, + NetworkElementServiceGetApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/mne/${queryArg.mneid}`, + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceGetAllFlattened: build.query< + NetworkElementServiceGetAllFlattenedApiResponse, + NetworkElementServiceGetAllFlattenedApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/mnes`, + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceAddList: build.mutation< + NetworkElementServiceAddListApiResponse, + NetworkElementServiceAddListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/mnes`, + method: 'POST', + body: queryArg.networkElementServiceAddListBody, + }), + }), + networkElementServiceSetPathList: build.mutation< + NetworkElementServiceSetPathListApiResponse, + NetworkElementServiceSetPathListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/mnes/paths`, + method: 'POST', + body: queryArg.networkElementServiceSetPathListBody, + }), + }), + networkElementServiceDelete: build.mutation< + NetworkElementServiceDeleteApiResponse, + NetworkElementServiceDeleteApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/mnes/${queryArg.mneid}`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceGetIntendedPath: build.query< + NetworkElementServiceGetIntendedPathApiResponse, + NetworkElementServiceGetIntendedPathApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/mnes/${queryArg.mneid}/intendedpaths/${queryArg.intendedPath}`, + params: { timestamp: queryArg.timestamp }, + }), + }), + networkElementServiceGetPath: build.query< + NetworkElementServiceGetPathApiResponse, + NetworkElementServiceGetPathApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}/mnes/${queryArg.mneid}/paths/${queryArg.path}`, + params: { timestamp: queryArg.timestamp }, + }), + }), + appServiceRegister: build.mutation< + AppServiceRegisterApiResponse, + AppServiceRegisterApiArg + >({ + query: (queryArg) => ({ + url: `/register`, + method: 'POST', + body: queryArg.appAppRegisterRequest, + }), + }), + roleServiceGetRoles: build.query< + RoleServiceGetRolesApiResponse, + RoleServiceGetRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles`, + params: { timestamp: queryArg.timestamp }, + }), + }), + roleServiceCreateRoles: build.mutation< + RoleServiceCreateRolesApiResponse, + RoleServiceCreateRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles/create`, + method: 'POST', + body: queryArg.rbacCreateRolesRequest, + }), + }), + roleServiceDeleteRoles: build.mutation< + RoleServiceDeleteRolesApiResponse, + RoleServiceDeleteRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles/delete`, + method: 'DELETE', + params: { + timestamp: queryArg.timestamp, + roleName: queryArg.roleName, + }, + }), + }), + roleServiceDeletePermissionsForRole: build.mutation< + RoleServiceDeletePermissionsForRoleApiResponse, + RoleServiceDeletePermissionsForRoleApiArg + >({ + query: (queryArg) => ({ + url: `/roles/delete/permissions`, + method: 'DELETE', + params: { + timestamp: queryArg.timestamp, + roleName: queryArg.roleName, + permissionsToDelete: queryArg.permissionsToDelete, + }, + }), + }), + roleServiceGetRole: build.query< + RoleServiceGetRoleApiResponse, + RoleServiceGetRoleApiArg + >({ + query: (queryArg) => ({ + url: `/roles/get`, + params: { + timestamp: queryArg.timestamp, + roleName: queryArg.roleName, + id: queryArg.id, + }, + }), + }), + roleServiceUpdateRoles: build.mutation< + RoleServiceUpdateRolesApiResponse, + RoleServiceUpdateRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles/update`, + method: 'POST', + body: queryArg.rbacUpdateRolesRequest, + }), + }), + routingTableServiceGetRoutes: build.query< + RoutingTableServiceGetRoutesApiResponse, + RoutingTableServiceGetRoutesApiArg + >({ + query: (queryArg) => ({ + url: `/routing`, + params: { timestamp: queryArg.timestamp }, + }), + }), + routingTableServiceAddRoutingTable: build.mutation< + RoutingTableServiceAddRoutingTableApiResponse, + RoutingTableServiceAddRoutingTableApiArg + >({ + query: (queryArg) => ({ + url: `/routing/create`, + method: 'POST', + body: queryArg.topologyAddRoutingTableRequest, + }), + }), + routingTableServiceDeleteRoute: build.mutation< + RoutingTableServiceDeleteRouteApiResponse, + RoutingTableServiceDeleteRouteApiArg + >({ + query: (queryArg) => ({ + url: `/routing/delete`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp, id: queryArg.id }, + }), + }), + topologyServiceGetTopology: build.query< + TopologyServiceGetTopologyApiResponse, + TopologyServiceGetTopologyApiArg + >({ + query: (queryArg) => ({ + url: `/topology`, + params: { timestamp: queryArg.timestamp }, + }), + }), + topologyServiceAddLink: build.mutation< + TopologyServiceAddLinkApiResponse, + TopologyServiceAddLinkApiArg + >({ + query: (queryArg) => ({ + url: `/topology/create`, + method: 'POST', + body: queryArg.topologyAddLinkRequest, + }), + }), + topologyServiceDeleteLink: build.mutation< + TopologyServiceDeleteLinkApiResponse, + TopologyServiceDeleteLinkApiArg + >({ + query: (queryArg) => ({ + url: `/topology/delete`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp, id: queryArg.id }, + }), + }), + topologyServiceUpdateLink: build.mutation< + TopologyServiceUpdateLinkApiResponse, + TopologyServiceUpdateLinkApiArg + >({ + query: (queryArg) => ({ + url: `/topology/update`, + method: 'POST', + body: queryArg.topologyUpdateLinkRequest, + }), + }), + userServiceGetUsers: build.query< + UserServiceGetUsersApiResponse, + UserServiceGetUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users`, + params: { timestamp: queryArg.timestamp }, + }), + }), + userServiceCreateUsers: build.mutation< + UserServiceCreateUsersApiResponse, + UserServiceCreateUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users/create`, + method: 'POST', + body: queryArg.rbacCreateUsersRequest, + }), + }), + userServiceDeleteUsers: build.mutation< + UserServiceDeleteUsersApiResponse, + UserServiceDeleteUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users/delete`, + method: 'DELETE', + params: { + timestamp: queryArg.timestamp, + username: queryArg.username, + }, + }), + }), + userServiceGetUser: build.query< + UserServiceGetUserApiResponse, + UserServiceGetUserApiArg + >({ + query: (queryArg) => ({ + url: `/users/get`, + params: { + timestamp: queryArg.timestamp, + name: queryArg.name, + id: queryArg.id, + }, + }), + }), + userServiceUpdateUsers: build.mutation< + UserServiceUpdateUsersApiResponse, + UserServiceUpdateUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users/update`, + method: 'POST', + body: queryArg.rbacUpdateUsersRequest, + }), + }), + }), + overrideExisting: false, +}) +export { injectedRtkApi as api } +export type AppServiceDeregisterApiResponse = + /** status 200 A successful response. */ AppAppDeregisterResponse +export type AppServiceDeregisterApiArg = { + appAppDeregisterRequest: AppAppDeregisterRequest +} +export type ConfigurationManagementServiceExportSdnConfigApiResponse = + /** status 200 A successful response. */ ConfigurationmanagementExportSdnConfigResponse +export type ConfigurationManagementServiceExportSdnConfigApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type ConfigurationManagementServiceImportSdnConfigApiResponse = + /** status 200 A successful response. */ ConfigurationmanagementImportSdnConfigResponse +export type ConfigurationManagementServiceImportSdnConfigApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + sdnConfigData?: string +} +export type AuthServiceLoginApiResponse = + /** status 200 A successful response. */ RbacLoginResponse +export type AuthServiceLoginApiArg = { + rbacLoginRequest: Login +} +export type AuthServiceLogoutApiResponse = + /** status 200 A successful response. */ RbacLogoutResponse +export type AuthServiceLogoutApiArg = { + username: string + timestamp?: string +} +export type NetworkElementServiceUpdateApiResponse = + /** status 200 A successful response. */ NetworkelementUpdateNetworkElementResponse +export type NetworkElementServiceUpdateApiArg = { + networkelementUpdateNetworkElementRequest: TodoChangeNameToFitTheRest +} +export type PndServiceGetPndApiResponse = + /** status 200 A successful response. */ PndGetPndResponse +export type PndServiceGetPndApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type PndServiceGetPndListApiResponse = + /** status 200 A successful response. */ PndGetPndListResponse +export type PndServiceGetPndListApiArg = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type PndServiceCreatePndListApiResponse = + /** status 200 A successful response. */ PndCreatePndListResponse +export type PndServiceCreatePndListApiArg = { + pndCreatePndListRequest: PndCreatePndListRequest +} +export type PndServiceDeletePndApiResponse = + /** status 200 A successful response. */ PndDeletePndResponse +export type PndServiceDeletePndApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkElementServiceGetChangeListApiResponse = + /** status 200 A successful response. */ NetworkelementGetChangeListResponse +export type NetworkElementServiceGetChangeListApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkElementServiceSetChangeListApiResponse = + /** status 200 A successful response. */ NetworkelementSetChangeListResponse +export type NetworkElementServiceSetChangeListApiArg = { + pid: string + networkElementServiceSetChangeListBody: NetworkElementServiceSetChangeListBody +} +export type NetworkElementServiceGetChangeApiResponse = + /** status 200 A successful response. */ NetworkelementGetChangeResponse +export type NetworkElementServiceGetChangeApiArg = { + pid: string + cuid: string[] + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkElementServiceGetApiResponse = + /** status 200 A successful response. */ GosdnnetworkelementGetResponse +export type NetworkElementServiceGetApiArg = { + pid: string + mneid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkElementServiceGetAllFlattenedApiResponse = + /** status 200 A successful response. */ NetworkelementGetAllFlattenedResponse +export type NetworkElementServiceGetAllFlattenedApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkElementServiceAddListApiResponse = + /** status 200 A successful response. */ NetworkelementAddListResponse +export type NetworkElementServiceAddListApiArg = { + pid: string + networkElementServiceAddListBody: NetworkElementServiceAddListBody +} +export type NetworkElementServiceSetPathListApiResponse = + /** status 200 A successful response. */ NetworkelementSetPathListResponse +export type NetworkElementServiceSetPathListApiArg = { + pid: string + networkElementServiceSetPathListBody: NetworkElementServiceSetPathListBody +} +export type NetworkElementServiceDeleteApiResponse = + /** status 200 A successful response. */ GosdnnetworkelementDeleteResponse +export type NetworkElementServiceDeleteApiArg = { + pid: string + mneid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkElementServiceGetIntendedPathApiResponse = + /** status 200 A successful response. */ NetworkelementGetIntendedPathResponse +export type NetworkElementServiceGetIntendedPathApiArg = { + pid: string + mneid: string + intendedPath: string + timestamp?: string +} +export type NetworkElementServiceGetPathApiResponse = + /** status 200 A successful response. */ NetworkelementGetPathResponse +export type NetworkElementServiceGetPathApiArg = { + pid: string + mneid: string + path: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type AppServiceRegisterApiResponse = + /** status 200 A successful response. */ AppAppRegisterResponse +export type AppServiceRegisterApiArg = { + appAppRegisterRequest: AppAppRegisterRequest +} +export type RoleServiceGetRolesApiResponse = + /** status 200 A successful response. */ RbacGetRolesResponse +export type RoleServiceGetRolesApiArg = { + timestamp?: string +} +export type RoleServiceCreateRolesApiResponse = + /** status 200 A successful response. */ RbacCreateRolesResponse +export type RoleServiceCreateRolesApiArg = { + rbacCreateRolesRequest: CreateRoles +} +export type RoleServiceDeleteRolesApiResponse = + /** status 200 A successful response. */ RbacDeleteRolesResponse +export type RoleServiceDeleteRolesApiArg = { + timestamp?: string + roleName?: string[] +} +export type RoleServiceDeletePermissionsForRoleApiResponse = + /** status 200 A successful response. */ RbacDeletePermissionsForRoleResponse +export type RoleServiceDeletePermissionsForRoleApiArg = { + timestamp?: string + roleName?: string + permissionsToDelete?: string[] +} +export type RoleServiceGetRoleApiResponse = + /** status 200 A successful response. */ RbacGetRoleResponse +export type RoleServiceGetRoleApiArg = { + timestamp?: string + roleName?: string + id?: string +} +export type RoleServiceUpdateRolesApiResponse = + /** status 200 A successful response. */ RbacUpdateRolesResponse +export type RoleServiceUpdateRolesApiArg = { + rbacUpdateRolesRequest: UpdateRoles +} +export type RoutingTableServiceGetRoutesApiResponse = + /** status 200 A successful response. */ TopologyGetRoutesResponse +export type RoutingTableServiceGetRoutesApiArg = { + timestamp?: string +} +export type RoutingTableServiceAddRoutingTableApiResponse = + /** status 200 A successful response. */ TopologyAddRoutingTableResponse +export type RoutingTableServiceAddRoutingTableApiArg = { + topologyAddRoutingTableRequest: TopologyAddRoutingTableRequest +} +export type RoutingTableServiceDeleteRouteApiResponse = + /** status 200 A successful response. */ TopologyDeleteRoutesResponse +export type RoutingTableServiceDeleteRouteApiArg = { + timestamp?: string + id?: string +} +export type TopologyServiceGetTopologyApiResponse = + /** status 200 A successful response. */ TopologyGetTopologyResponse +export type TopologyServiceGetTopologyApiArg = { + timestamp?: string +} +export type TopologyServiceAddLinkApiResponse = + /** status 200 A successful response. */ TopologyAddLinkResponse +export type TopologyServiceAddLinkApiArg = { + topologyAddLinkRequest: TopologyAddLinkRequest +} +export type TopologyServiceDeleteLinkApiResponse = + /** status 200 A successful response. */ TopologyDeleteLinkResponse +export type TopologyServiceDeleteLinkApiArg = { + timestamp?: string + id?: string +} +export type TopologyServiceUpdateLinkApiResponse = + /** status 200 A successful response. */ TopologyUpdateLinkResponse +export type TopologyServiceUpdateLinkApiArg = { + topologyUpdateLinkRequest: TopologyUpdateLinkRequest +} +export type UserServiceGetUsersApiResponse = + /** status 200 A successful response. */ RbacGetUsersResponse +export type UserServiceGetUsersApiArg = { + timestamp?: string +} +export type UserServiceCreateUsersApiResponse = + /** status 200 A successful response. */ RbacCreateUsersResponse +export type UserServiceCreateUsersApiArg = { + rbacCreateUsersRequest: CreateUsers +} +export type UserServiceDeleteUsersApiResponse = + /** status 200 A successful response. */ RbacDeleteUsersResponse +export type UserServiceDeleteUsersApiArg = { + timestamp?: string + username?: string[] +} +export type UserServiceGetUserApiResponse = + /** status 200 A successful response. */ RbacGetUserResponse +export type UserServiceGetUserApiArg = { + timestamp?: string + /** TODO(faseid): reconsider if this is necessary as required, but id is not? */ + name?: string + id?: string +} +export type UserServiceUpdateUsersApiResponse = + /** status 200 A successful response. */ RbacUpdateUsersResponse +export type UserServiceUpdateUsersApiArg = { + rbacUpdateUsersRequest: UpdateUsers +} +export type AppAppDeregisterResponse = { + timestamp?: string +} +export type ProtobufAny = { + /** A URL/resource name that uniquely identifies the type of the serialized + protocol buffer message. This string must contain at least + one "/" character. The last segment of the URL's path must represent + the fully qualified name of the type (as in + `path/google.protobuf.Duration`). The name should be in a canonical form + (e.g., leading "." is not accepted). + + In practice, teams usually precompile into the binary all types that they + expect it to use in the context of Any. However, for URLs which use the + scheme `http`, `https`, or no scheme, one can optionally set up a type + server that maps type URLs to message definitions as follows: + + * If no scheme is provided, `https` is assumed. + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the official + protobuf release, and it is not used for type URLs beginning with + type.googleapis.com. As of May 2023, there are no widely used type server + implementations and no plans to implement one. + + Schemes other than `http`, `https` (or the empty scheme) might be + used with implementation specific semantics. */ + '@type'?: string + [key: string]: any +} +export type GooglerpcStatus = { + code?: number + message?: string + details?: ProtobufAny[] +} +export type AppAppDeregisterRequest = { + timestamp?: string + appname?: string +} +export type ConfigurationmanagementExportSdnConfigResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + sdnConfigData?: string +} +export type ConfigurationmanagementImportSdnConfigResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type RbacLoginResponse = { + timestamp?: string + token?: string +} +export type Login = { + timestamp?: string + username?: string + pwd?: string +} +export type RbacLogoutResponse = { + timestamp?: string +} +export type NetworkelementUpdateNetworkElementResponse = { + timestamp?: string +} +export type PluginRegistryManifest = { + name?: string + firmware?: string + author?: string + version?: string +} +export type PluginRegistryPlugin = { + id?: string + manifest?: PluginRegistryManifest +} +export type GnmiPathElem = { + /** The name of the element in the path. */ + name?: string + /** Map of key (attribute) name to value. */ + key?: { + [key: string]: string + } +} +export type GnmiPath = { + /** Elements of the path are no longer encoded as a string, but rather within + the elem field as a PathElem message. */ + element?: string[] + /** Label to disambiguate path. */ + origin?: string + /** Elements of the path. */ + elem?: GnmiPathElem[] + target?: string +} +export type EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 = + 'JSON' | 'BYTES' | 'PROTO' | 'ASCII' | 'JSON_IETF' +export type GnmiValue = { + /** Value of the variable being transmitted. */ + value?: string + type?: EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 +} +export type GnmiDecimal64 = { + /** Set of digits. */ + digits?: string + /** Number of digits following the decimal point. */ + precision?: number +} +export type GnmiScalarArray = { + /** The set of elements within the array. Each TypedValue message should + specify only elements that have a field identifier of 1-7 (i.e., the + values are scalar values). */ + element?: GnmiTypedValue[] +} +export type GnmiTypedValue = { + /** String value. */ + stringVal?: string + /** Integer value. */ + intVal?: string + /** Unsigned integer value. */ + uintVal?: string + /** Bool value. */ + boolVal?: boolean + /** Arbitrary byte sequence value. */ + bytesVal?: string + /** Floating point value. */ + floatVal?: number + decimalVal?: GnmiDecimal64 + leaflistVal?: GnmiScalarArray + anyVal?: ProtobufAny + /** JSON-encoded text. */ + jsonVal?: string + /** JSON-encoded text per RFC7951. */ + jsonIetfVal?: string + /** Arbitrary ASCII text. */ + asciiVal?: string + /** Protobuf binary encoded bytes. The message type is not included. + See the specification at + github.com/openconfig/reference/blob/master/rpc/gnmi/protobuf-vals.md + for a complete specification. */ + protoBytes?: string +} +export type UpdateIsAReUsableMessageThatIsUsedToStoreAParticularPathValuePairReferenceGNmiSpecificationSection21 = + { + path?: GnmiPath + value?: GnmiValue + val?: GnmiTypedValue + /** Number of coalesced duplicates. */ + duplicates?: number + } +export type NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21 = + { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + prefix?: GnmiPath + alias?: string + /** Data elements that have changed values. */ + update?: UpdateIsAReUsableMessageThatIsUsedToStoreAParticularPathValuePairReferenceGNmiSpecificationSection21[] + /** Data elements that have been deleted. */ + delete?: GnmiPath[] + /** This notification contains a set of paths that are always updated together + referenced by a globally unique prefix. */ + atomic?: boolean + } +export type TransportGnmiTransportOption = { + compression?: string + grpcDialOptions?: { + [key: string]: string + } + token?: string + encoding?: EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 +} +export type TransportRestconfTransportOption = object +export type ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums = + + | 'TYPE_UNSPECIFIED' + | 'TYPE_OPENCONFIG' + | 'TYPE_CONTAINERISED' + | 'TYPE_PLUGIN' +export type TransportTransportOption = { + address?: string + username?: string + password?: string + tls?: boolean + gnmiTransportOption?: TransportGnmiTransportOption + restconfTransportOption?: TransportRestconfTransportOption + type?: ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums +} +export type ConflictMetadata = { + resourceVersion?: string +} +export type NetworkelementManagedNetworkElement = { + id?: string + name?: string + model?: string + plugin?: PluginRegistryPlugin + mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] + transportAddress?: string + transportOption?: TransportTransportOption + metadata?: ConflictMetadata + associatedPnd?: string + gnmiSubscribePaths?: string[] +} +export type TodoChangeNameToFitTheRest = { + timestamp?: string + networkElement?: NetworkelementManagedNetworkElement +} +export type PndPrincipalNetworkDomain = { + id?: string + name?: string + description?: string +} +export type PndGetPndResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain +} +export type PndGetPndListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain[] +} +export type PndCreatePndListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type PndPndCreateProperties = { + name?: string + description?: string +} +export type PndCreatePndListRequest = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPndCreateProperties[] +} +export type PndDeletePndResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkelementChangeState = + | 'CHANGE_STATE_UNSPECIFIED' + | 'CHANGE_STATE_PENDING' + | 'CHANGE_STATE_COMMITTED' + | 'CHANGE_STATE_CONFIRMED' + | 'CHANGE_STATE_INCONSISTENT' +export type NetworkelementChange = { + id?: string + age?: string + state?: NetworkelementChangeState + diff?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21 +} +export type NetworkelementGetChangeListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + change?: NetworkelementChange[] +} +export type GosdnnetworkelementSetResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + id?: string +} +export type NetworkelementSetChangeListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + responses?: GosdnnetworkelementSetResponse[] +} +export type GosdnnetworkelementOperation = + | 'OPERATION_UNSPECIFIED' + | 'OPERATION_CREATE' + | 'OPERATION_COMMIT' + | 'OPERATION_CONFIRM' +export type NetworkelementSetChange = { + cuid?: string + op?: GosdnnetworkelementOperation +} +export type NetworkElementServiceSetChangeListBody = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + change?: NetworkelementSetChange[] +} +export type NetworkelementGetChangeResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + change?: NetworkelementChange[] +} +export type GosdnnetworkelementGetResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mne?: NetworkelementManagedNetworkElement +} +export type NetworkelementFlattenedManagedNetworkElement = { + id?: string + name?: string + pid?: string + pluginid?: string +} +export type NetworkelementGetAllFlattenedResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mne?: NetworkelementFlattenedManagedNetworkElement[] +} +export type NetworkelementAddListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + responses?: GosdnnetworkelementSetResponse[] +} +export type NetworkelementSetMne = { + address?: string + pid?: string + pluginId?: string + mneName?: string + transportOption?: TransportTransportOption + gnmiSubscribePaths?: string[] + mneId?: string +} +export type NetworkElementServiceAddListBody = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + mne?: NetworkelementSetMne[] +} +export type NetworkelementSetPathListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + responses?: GosdnnetworkelementSetResponse[] +} +export type NetworkelementApiOperation = + | 'API_OPERATION_UNSPECIFIED' + | 'API_OPERATION_UPDATE' + | 'API_OPERATION_REPLACE' + | 'API_OPERATION_DELETE' +export type NetworkelementChangeRequest = { + mneid?: string + path?: GnmiPath + value?: GnmiTypedValue + apiOp?: NetworkelementApiOperation +} +export type NetworkElementServiceSetPathListBody = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + changeRequest?: NetworkelementChangeRequest[] +} +export type GosdnnetworkelementDeleteResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkelementGetIntendedPathResponse = { + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] +} +export type NetworkelementGetPathResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] +} +export type AppAppRegisterResponse = { + timestamp?: string + queueconnection?: string +} +export type AppAppRegisterRequest = { + timestamp?: string + appname?: string + token?: string +} +export type GosdnrbacRole = { + id?: string + name?: string + description?: string + permissions?: string[] +} +export type RbacGetRolesResponse = { + timestamp?: string + roles?: GosdnrbacRole[] +} +export type RbacCreateRolesResponse = { + timestamp?: string +} +export type CreateRoles = { + timestamp?: string + roles?: GosdnrbacRole[] +} +export type RbacDeleteRolesResponse = { + timestamp?: string +} +export type RbacDeletePermissionsForRoleResponse = { + timestamp?: string +} +export type RbacGetRoleResponse = { + timestamp?: string + role?: GosdnrbacRole +} +export type RbacUpdateRolesResponse = { + timestamp?: string +} +export type UpdateRoles = { + timestamp?: string + roles?: GosdnrbacRole[] +} +export type TopologyRoute = { + id?: string + targetIPRange?: string + nextHopIP?: string + portID?: string + metric?: string +} +export type TopologyRoutingTable = { + id?: string + nodeID?: string + routes?: TopologyRoute[] + metadata?: ConflictMetadata +} +export type TopologyGetRoutesResponse = { + timestamp?: string + routingTables?: TopologyRoutingTable[] +} +export type TopologyAddRoutingTableResponse = { + timestamp?: string +} +export type TopologyAddRoutingTableRequest = { + timestamp?: string + routingTable?: TopologyRoutingTable +} +export type TopologyDeleteRoutesResponse = { + timestamp?: string +} +export type TopologyNode = { + id?: string + name?: string + metadata?: ConflictMetadata +} +export type GosdntopologyConfiguration = { + ip?: string + prefixLength?: string +} +export type TopologyPort = { + id?: string + name?: string + configuration?: GosdntopologyConfiguration + metadata?: ConflictMetadata +} +export type TopologyLink = { + id?: string + name?: string + sourceNode?: TopologyNode + targetNode?: TopologyNode + sourcePort?: TopologyPort + targetPort?: TopologyPort + metadata?: ConflictMetadata +} +export type TopologyTopology = { + links?: TopologyLink[] +} +export type TopologyGetTopologyResponse = { + timestamp?: string + toplogy?: TopologyTopology +} +export type TopologyAddLinkResponse = { + timestamp?: string +} +export type TopologyAddLinkRequest = { + timestamp?: string + link?: TopologyLink +} +export type TopologyDeleteLinkResponse = { + timestamp?: string +} +export type TopologyUpdateLinkResponse = { + timestamp?: string +} +export type TopologyUpdateLinkRequest = { + timestamp?: string + link?: TopologyLink +} +export type RbacUser = { + id?: string + name?: string + roles?: { + [key: string]: string + } + password?: string + token?: string + metadata?: ConflictMetadata +} +export type RbacGetUsersResponse = { + timestamp?: string + user?: RbacUser[] +} +export type RbacCreateUsersResponse = { + timestamp?: string +} +export type CreateUsers = { + timestamp?: string + user?: RbacUser[] +} +export type RbacDeleteUsersResponse = { + timestamp?: string +} +export type RbacGetUserResponse = { + timestamp?: string + user?: RbacUser +} +export type RbacUpdateUsersResponse = { + timestamp?: string +} +export type RbacUpdateUser = { + id?: string + name?: string + roles?: { + [key: string]: string + } + password?: string + token?: string + metadata?: ConflictMetadata +} +export type UpdateUsers = { + timestamp?: string + user?: RbacUpdateUser[] +} +export const { + useAppServiceDeregisterMutation, + useConfigurationManagementServiceExportSdnConfigQuery, + useConfigurationManagementServiceImportSdnConfigMutation, + useAuthServiceLoginMutation, + useAuthServiceLogoutMutation, + useNetworkElementServiceUpdateMutation, + usePndServiceGetPndQuery, + usePndServiceGetPndListQuery, + usePndServiceCreatePndListMutation, + usePndServiceDeletePndMutation, + useNetworkElementServiceGetChangeListQuery, + useNetworkElementServiceSetChangeListMutation, + useNetworkElementServiceGetChangeQuery, + useNetworkElementServiceGetQuery, + useNetworkElementServiceGetAllFlattenedQuery, + useNetworkElementServiceAddListMutation, + useNetworkElementServiceSetPathListMutation, + useNetworkElementServiceDeleteMutation, + useNetworkElementServiceGetIntendedPathQuery, + useNetworkElementServiceGetPathQuery, + useAppServiceRegisterMutation, + useRoleServiceGetRolesQuery, + useRoleServiceCreateRolesMutation, + useRoleServiceDeleteRolesMutation, + useRoleServiceDeletePermissionsForRoleMutation, + useRoleServiceGetRoleQuery, + useRoleServiceUpdateRolesMutation, + useRoutingTableServiceGetRoutesQuery, + useRoutingTableServiceAddRoutingTableMutation, + useRoutingTableServiceDeleteRouteMutation, + useTopologyServiceGetTopologyQuery, + useTopologyServiceAddLinkMutation, + useTopologyServiceDeleteLinkMutation, + useTopologyServiceUpdateLinkMutation, + useUserServiceGetUsersQuery, + useUserServiceCreateUsersMutation, + useUserServiceDeleteUsersMutation, + useUserServiceGetUserQuery, + useUserServiceUpdateUsersMutation, +} = injectedRtkApi diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index db0b82766..6c95d80aa 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -10,13 +10,12 @@ import { import './index.scss' import Landingpage from './pages/landingpage/landingpage' import LoginPage from './pages/login/login' -import initStore from './stores/api.store' import './i18n/config' import { I18nextProvider } from 'react-i18next' import i18next from 'i18next' - -initStore() +import { Provider } from 'react-redux' +import { store } from './stores' const root = ReactDOM.createRoot(document.getElementById('root') as Container) @@ -34,8 +33,10 @@ const router = createBrowserRouter( root.render( <React.StrictMode> - <I18nextProvider i18n={i18next}> - <RouterProvider router={router} /> - </I18nextProvider> + <Provider store={store}> + <I18nextProvider i18n={i18next}> + <RouterProvider router={router} /> + </I18nextProvider> + </Provider> </React.StrictMode> ) diff --git a/react-ui/src/pages/login/login.tsx b/react-ui/src/pages/login/login.tsx index 7eb213e78..ffe8928e3 100644 --- a/react-ui/src/pages/login/login.tsx +++ b/react-ui/src/pages/login/login.tsx @@ -2,43 +2,42 @@ import { Button, Col, Container, Form, Image, Row } from 'react-bootstrap' import { useTranslation } from 'react-i18next' import './login.scss' -import { AuthServiceApiAuthServiceLoginRequest } from '@api/types/ObjectParamAPI' import logo from '@assets/logo.svg' import React, { useRef } from 'react' -import { AuthServiceApi, RbacLoginRequest, RbacLoginResponse, createConfiguration } from '@api/index' +import { AuthServiceLoginApiArg, useAuthServiceLoginMutation } from '@api/api' const LoginPage = () => { const { t } = useTranslation('common') const usernameRef = useRef<HTMLInputElement>(null) const passwordRef = useRef<HTMLInputElement>(null) - const getAuthPayload = (): RbacLoginRequest => { + const getAuthPayload = (): AuthServiceLoginApiArg => { const username = usernameRef.current?.value const password = passwordRef.current?.value // TODO check values - const payload: RbacLoginRequest = { - username: username, - pwd: password, - timestamp: new Date().toString(), + const payload: AuthServiceLoginApiArg = { + rbacLoginRequest: { + username: username, + pwd: password, + timestamp: new Date().getTime().toString(), + } } return payload; } + const [ + sendLogin, + ] = useAuthServiceLoginMutation() + const login = (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault() - const configuration = createConfiguration(); - const apiInstance = new AuthServiceApi(configuration); - const payload = getAuthPayload(); - - - apiInstance.authServiceLogin(payload).then((response:RbacLoginResponse) => { - console.log('API called successfully. Returned data: ' + response); - }).catch((error:any) => console.error(error)); - + sendLogin(payload).unwrap() + .then((payload) => console.log('fulfilled', payload)) + .catch((error) => console.error('rejected', error)); } return ( diff --git a/react-ui/src/setupProxy.js b/react-ui/src/setupProxy.js deleted file mode 100644 index afeb740de..000000000 --- a/react-ui/src/setupProxy.js +++ /dev/null @@ -1,11 +0,0 @@ -const { createProxyMiddleware } = require('http-proxy-middleware'); - -module.exports = function(app) { - app.use( - '/api', - createProxyMiddleware({ - target: 'http://127.0.0.1:8089', - changeOrigin: true, - }) - ); -}; \ No newline at end of file diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index 2ae49c724..5f9077aee 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -1,18 +1,7 @@ -import { combineReducers } from 'redux' -import userReducer from './slices/user.reducer' -import { configureStore } from '@reduxjs/toolkit' +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' -const getReducers = () => { - return combineReducers({ - userReducer, - }) -} - -const initStore = () => { - return configureStore({ - reducer: getReducers(), - }) -} - -//export type RootState = ReturnType<typeof store.getState> -export default initStore +// initialize an empty api service that we'll inject endpoints into later as needed +export const emptySplitApi = createApi({ + baseQuery: fetchBaseQuery({ baseUrl: '/api' }), + endpoints: () => ({}), +}) \ No newline at end of file diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts new file mode 100644 index 000000000..299595f18 --- /dev/null +++ b/react-ui/src/stores/index.ts @@ -0,0 +1,23 @@ +import { combineReducers } from 'redux' +import userReducer from './slices/user.reducer' +import { configureStore } from '@reduxjs/toolkit' +import { emptySplitApi } from './api.store' +import { setupListeners } from '@reduxjs/toolkit/query' + +const getReducers = () => { + return combineReducers({ + userReducer, + [emptySplitApi.reducerPath]: emptySplitApi.reducer + }) +} + + +export const store = configureStore({ + reducer: getReducers(), + middleware: (getDefaultMiddleware) => + getDefaultMiddleware().concat(emptySplitApi.middleware), +}) + +setupListeners(store.dispatch) + +//export type RootState = ReturnType<typeof store.getState> \ No newline at end of file diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 977976c0f..4230ee19f 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -29,7 +29,7 @@ "include": [ "src/**/*.d.ts", "src/**/*.ts", - "src/**/*.tsx", + "src/**/*.tsx", "src/stores/api.store.ts", "scripts/test.ts", ], //"references": [{ "path": "./tsconfig.node.json" }] } \ No newline at end of file diff --git a/react-ui/tsconfig.node.json b/react-ui/tsconfig.node.json index d5ed4eaa8..9357c44f3 100644 --- a/react-ui/tsconfig.node.json +++ b/react-ui/tsconfig.node.json @@ -2,7 +2,7 @@ "compilerOptions": { "composite": true, "skipLibCheck": true, - "module": "ESNext", + "module": "ES2020", "moduleResolution": "bundler", "allowSyntheticDefaultImports": true, "strict": true diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 7aa8ebc5a..4d70f80f3 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -8,10 +8,10 @@ export default defineConfig({ port: 3000, proxy: { '/api': { - target: 'https://localhost:8089', + target: 'http://127.0.0.1:8080', changeOrigin: true, - secure: false, - ws: true, + secure: false, + rewrite: (path) => path.replace(/^\/api/, ''), configure: (proxy, _options) => { proxy.on('error', (err, _req, _res) => { console.log('proxy error', err); diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index e37ab2bee..914516cda 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -29,6 +29,38 @@ jsonpointer "^5.0.0" leven "^3.1.0" +"@apidevtools/json-schema-ref-parser@9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz#5d9000a3ac1fd25404da886da6b266adcd99cf1c" + integrity sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg== + dependencies: + "@jsdevtools/ono" "^7.1.3" + call-me-maybe "^1.0.1" + js-yaml "^3.13.1" + +"@apidevtools/openapi-schemas@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17" + integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== + +"@apidevtools/swagger-methods@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" + integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== + +"@apidevtools/swagger-parser@^10.0.2", "@apidevtools/swagger-parser@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz#a987d71e5be61feb623203be0c96e5985b192ab6" + integrity sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw== + dependencies: + "@apidevtools/json-schema-ref-parser" "9.0.6" + "@apidevtools/openapi-schemas" "^2.1.0" + "@apidevtools/swagger-methods" "^3.0.2" + "@jsdevtools/ono" "^7.1.3" + ajv "^8.6.3" + ajv-draft-04 "^1.0.0" + call-me-maybe "^1.0.1" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.8.3": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" @@ -1625,6 +1657,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -1948,6 +1985,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" @@ -2165,6 +2207,19 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== +"@rtk-query/codegen-openapi@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@rtk-query/codegen-openapi/-/codegen-openapi-1.2.0.tgz#2c63cbbd80382c4ba6c9fab5e9004efb43637de3" + integrity sha512-Sru3aPHyFC0Tb7jeFh/kVMGBdQUcofb9frrHhjNSRLEoJWsG9fjaioUx3nPT5HZVbdAvAFF4xMWFQNfgJBrAGw== + dependencies: + "@apidevtools/swagger-parser" "^10.0.2" + commander "^6.2.0" + oazapfts "^4.8.0" + prettier "^2.2.1" + semver "^7.3.5" + swagger2openapi "^7.0.4" + typescript "^5.0.0" + "@rushstack/eslint-patch@^1.1.0": version "1.10.3" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" @@ -3109,6 +3164,11 @@ agent-base@6: dependencies: debug "4" +ajv-draft-04@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -3148,6 +3208,16 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.4.1" +ajv@^8.6.3: + version "8.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.15.0.tgz#d918c661e3e820bbbc65a320e182ee56a1aa978a" + integrity sha512-15BTtQUOsSrmHCy+B4VnAiJAJxJ8IFgu6fcjFQF3jQYZ78nLSQthlFg4ehp+NLIyfvFgOlxNsjKIEhydtFPVHQ== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^2.3.0" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -3699,6 +3769,11 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3838,6 +3913,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + 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" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3908,6 +3992,11 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -4796,6 +4885,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + esbuild@^0.20.1: version "0.20.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" @@ -5297,6 +5391,16 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-uri@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-2.3.0.tgz#bdae493942483d299e7285dcb4627767d42e2793" + integrity sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -5881,6 +5985,11 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -7362,7 +7471,7 @@ minimatch@^9.0.1, minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -7444,6 +7553,20 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -7454,6 +7577,13 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" @@ -7500,6 +7630,63 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" + +oazapfts@^4.8.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/oazapfts/-/oazapfts-4.12.0.tgz#8a86c5fe5a1237b16b05d06d05815cffa2a2b949" + integrity sha512-hNKRG4eLYceuJuqDDx7Uqsi8p3j5k83gNKSo2qnUOTiiU03sCQOjXxOqCXDbzRcuDFyK94+1PBIpotK4NoxIjw== + dependencies: + "@apidevtools/swagger-parser" "^10.1.0" + lodash "^4.17.21" + minimist "^1.2.8" + swagger2openapi "^7.0.8" + typescript "^5.2.2" + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -8413,7 +8600,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.0: +prettier@^2.0.0, prettier@^2.2.1: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -8845,6 +9032,11 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + regenerate-unicode-properties@^10.1.0: version "10.1.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" @@ -9301,6 +9493,50 @@ shell-quote@^1.7.3, shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -9484,7 +9720,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9714,6 +9950,23 @@ svgo@^2.7.0: picocolors "^1.0.0" stable "^0.1.8" +swagger2openapi@^7.0.4, swagger2openapi@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -9885,6 +10138,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -10020,7 +10278,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^5.2.2: +typescript@^5.0.0, typescript@^5.2.2: version "5.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== @@ -10251,6 +10509,11 @@ web-vitals@^2.1.4: resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -10403,6 +10666,14 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -10737,6 +11008,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -10750,6 +11026,19 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.0.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + 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.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" -- GitLab From 0adcd292cea9fd008d50be452a04fce0c4e935a6 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 1 Jul 2024 13:27:20 +0200 Subject: [PATCH 08/78] add translations --- .../src/i18n/locales/de/translations.json | 11 ++- .../src/i18n/locales/en/translations.json | 26 ++++--- react-ui/src/pages/login/login.tsx | 67 ++++++++++++++----- 3 files changed, 73 insertions(+), 31 deletions(-) diff --git a/react-ui/src/i18n/locales/de/translations.json b/react-ui/src/i18n/locales/de/translations.json index 0c6599156..c12a0b2e9 100644 --- a/react-ui/src/i18n/locales/de/translations.json +++ b/react-ui/src/i18n/locales/de/translations.json @@ -1,14 +1,19 @@ { "global": { "form": { - "submit": "Abschicken" + "submit": "Abshcicken", + "empty_field": "Das Feld darf nicht leer sein" } }, "login": { "form": { - "username": "Benutzername", - "password": "Passwort" + "username": { + "label": "Benutzername" + }, + "password": { + "label": "Passwort" + } } } } \ No newline at end of file diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index 0cc55e9af..4170131a1 100644 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -1,14 +1,20 @@ { - "global": { - "form": { - "submit": "Submit" - } - }, - - "login": { - "form": { - "username": "Username", - "password": "Password" + "common": { + "global": { + "form": { + "submit": "Submit", + "empty_field": "This field can´t be empty" + } + }, + "login": { + "form": { + "username": { + "label": "Username" + }, + "password": { + "label": "Password" + } + } } } } \ No newline at end of file diff --git a/react-ui/src/pages/login/login.tsx b/react-ui/src/pages/login/login.tsx index ffe8928e3..800e7295f 100644 --- a/react-ui/src/pages/login/login.tsx +++ b/react-ui/src/pages/login/login.tsx @@ -2,20 +2,34 @@ import { Button, Col, Container, Form, Image, Row } from 'react-bootstrap' import { useTranslation } from 'react-i18next' import './login.scss' -import logo from '@assets/logo.svg' -import React, { useRef } from 'react' import { AuthServiceLoginApiArg, useAuthServiceLoginMutation } from '@api/api' +import logo from '@assets/logo.svg' +import React, { useRef, useState } from 'react' +/** + * The `/login` page. It renders the login form with all the encapsulated business logic + * + * @description The store is getting mutated by a successful login + */ const LoginPage = () => { const { t } = useTranslation('common') const usernameRef = useRef<HTMLInputElement>(null) const passwordRef = useRef<HTMLInputElement>(null) - const getAuthPayload = (): AuthServiceLoginApiArg => { - const username = usernameRef.current?.value - const password = passwordRef.current?.value + const [validated, setValidated] = useState(false); + const [ + sendLogin, + ] = useAuthServiceLoginMutation() + + + const isInputValid = (username: string | undefined, password: string | undefined): boolean => { + return !!username && !!password; + } - // TODO check values + /** + * Returns the /login payload + */ + const getAuthPayload = (username: string, password: string): AuthServiceLoginApiArg => { const payload: AuthServiceLoginApiArg = { rbacLoginRequest: { username: username, @@ -27,17 +41,27 @@ const LoginPage = () => { return payload; } - const [ - sendLogin, - ] = useAuthServiceLoginMutation() - + /** + * Tries to `/login` by using the input fields. + * + * @description The fields are getting validated against null values + * @param event Submit event + */ const login = (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault() + const username = usernameRef.current?.value + const password = passwordRef.current?.value + + setValidated(true); + const inputInvalid = !isInputValid(username, password); + if (inputInvalid) { + return; + } - const payload = getAuthPayload(); - sendLogin(payload).unwrap() - .then((payload) => console.log('fulfilled', payload)) - .catch((error) => console.error('rejected', error)); + const authPayload = getAuthPayload(username!, password!); + sendLogin(authPayload).unwrap() + .then((payload) => console.log('fulfilled', payload)) + .catch((error) => console.error('rejected', error)); } return ( @@ -48,23 +72,30 @@ const LoginPage = () => { <Row className="mt-2 justify-content-center"> <Col md={6} sm={10} className="c-box p-4"> <h1 className="text-center h2">goSDN - Web</h1> - <Form className="mt-4" onSubmit={login}> + <Form className="mt-4" noValidate validated={validated} onSubmit={login}> <Form.Group className="mb-3" controlId="loginForm.username" > - <Form.Label>{t('login.form.username')}</Form.Label> + <Form.Label>{t('login.form.username.label')}</Form.Label> <Form.Control type="text" ref={usernameRef} + required /> + <Form.Control.Feedback type="invalid"> + {t('global.form.empty_field')} + </Form.Control.Feedback> </Form.Group> <Form.Group className="mb-3" controlId="loginForm.pasword" > - <Form.Label>{t('login.form.password')}</Form.Label> - <Form.Control type="password" ref={passwordRef} /> + <Form.Label>{t('login.form.password.label')}</Form.Label> + <Form.Control type="password" ref={passwordRef} required /> + <Form.Control.Feedback type="invalid"> + {t('global.form.empty_field')} + </Form.Control.Feedback> </Form.Group> <Button variant="primary" -- GitLab From 8247cc8856b026cdf007d569b571d2c73a5281a8 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 2 Jul 2024 12:50:11 +0200 Subject: [PATCH 09/78] added font and some styles --- react-ui/public/fonts/Inter.ttf | Bin 0 -> 804612 bytes react-ui/src/i18n/config.js | 4 +-- .../src/i18n/locales/de/translations.json | 29 ++++++++-------- .../src/i18n/locales/en/translations.json | 1 + react-ui/src/index.scss | 2 +- react-ui/src/pages/login/login.tsx | 10 ++++++ react-ui/src/stores/index.ts | 7 ++-- react-ui/src/stores/slices/login.reducer.ts | 26 +++++++++++++++ react-ui/src/stores/slices/user.reducer.ts | 31 ------------------ react-ui/src/style/box.scss | 18 ++++++++-- react-ui/src/style/colors.scss | 7 ++++ react-ui/src/style/fonts.scss | 8 +++++ react-ui/src/style/index.scss | 4 +++ react-ui/src/style/style.scss | 10 ------ 14 files changed, 93 insertions(+), 64 deletions(-) create mode 100644 react-ui/public/fonts/Inter.ttf create mode 100644 react-ui/src/stores/slices/login.reducer.ts delete mode 100644 react-ui/src/stores/slices/user.reducer.ts create mode 100644 react-ui/src/style/colors.scss create mode 100644 react-ui/src/style/fonts.scss create mode 100644 react-ui/src/style/index.scss delete mode 100644 react-ui/src/style/style.scss diff --git a/react-ui/public/fonts/Inter.ttf b/react-ui/public/fonts/Inter.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e72470871b8fc198da424b1e17ed729c202829cf GIT binary patch literal 804612 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%0Ax6j{ZP3#Ka=%E2kFnV}3!H!zffX;7aA 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�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%0A&7R<ezA4~-nJxGL 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 literal 0 HcmV?d00001 diff --git a/react-ui/src/i18n/config.js b/react-ui/src/i18n/config.js index 398603ff7..3946a8db2 100644 --- a/react-ui/src/i18n/config.js +++ b/react-ui/src/i18n/config.js @@ -8,10 +8,10 @@ i18next.init({ lng: 'en', resources: { en: { - common: common_en + ...common_en }, de: { - common: common_de + ...common_de } }, }); \ No newline at end of file diff --git a/react-ui/src/i18n/locales/de/translations.json b/react-ui/src/i18n/locales/de/translations.json index c12a0b2e9..e7d425b7b 100644 --- a/react-ui/src/i18n/locales/de/translations.json +++ b/react-ui/src/i18n/locales/de/translations.json @@ -1,18 +1,19 @@ { - "global": { - "form": { - "submit": "Abshcicken", - "empty_field": "Das Feld darf nicht leer sein" - } - }, - - "login": { - "form": { - "username": { - "label": "Benutzername" - }, - "password": { - "label": "Passwort" + "common": { + "global": { + "form": { + "submit": "Abshcicken", + "empty_field": "Das Feld darf nicht leer sein" + } + }, + "login": { + "form": { + "username": { + "label": "Benutzername" + }, + "password": { + "label": "Passwort" + } } } } diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index 4170131a1..d03dd572d 100644 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -8,6 +8,7 @@ }, "login": { "form": { + "failed": "The username or password is invalid", "username": { "label": "Username" }, diff --git a/react-ui/src/index.scss b/react-ui/src/index.scss index cdcaaa281..9774d5bd6 100644 --- a/react-ui/src/index.scss +++ b/react-ui/src/index.scss @@ -1,4 +1,4 @@ -@import './style/style.scss'; +@import './style/index.scss'; body { margin: 0; diff --git a/react-ui/src/pages/login/login.tsx b/react-ui/src/pages/login/login.tsx index 800e7295f..24842bab1 100644 --- a/react-ui/src/pages/login/login.tsx +++ b/react-ui/src/pages/login/login.tsx @@ -5,6 +5,9 @@ import './login.scss' import { AuthServiceLoginApiArg, useAuthServiceLoginMutation } from '@api/api' import logo from '@assets/logo.svg' import React, { useRef, useState } from 'react' +import { PageLoginState } from 'src/stores/slices/login.reducer' +import { useDispatch, useSelector } from 'react-redux' +import { AppDispatch } from 'src/stores' /** * The `/login` page. It renders the login form with all the encapsulated business logic @@ -17,6 +20,9 @@ const LoginPage = () => { const passwordRef = useRef<HTMLInputElement>(null) const [validated, setValidated] = useState(false); + const [valid, checked] = useSelector((state: PageLoginState) => state); + const {setLoginFormValidity} = useDispatch<AppDispatch>(); + const [ sendLogin, ] = useAuthServiceLoginMutation() @@ -54,6 +60,7 @@ const LoginPage = () => { setValidated(true); const inputInvalid = !isInputValid(username, password); + setLoginFormValidity(inputInvalid) if (inputInvalid) { return; } @@ -72,6 +79,9 @@ const LoginPage = () => { <Row className="mt-2 justify-content-center"> <Col md={6} sm={10} className="c-box p-4"> <h1 className="text-center h2">goSDN - Web</h1> + + <div className="danger-box">{t('login.form.failed')}</div> + <Form className="mt-4" noValidate validated={validated} onSubmit={login}> <Form.Group className="mb-3" diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index 299595f18..28a3e5300 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,12 +1,12 @@ import { combineReducers } from 'redux' -import userReducer from './slices/user.reducer' +import loginPageReducer from './slices/login.reducer' import { configureStore } from '@reduxjs/toolkit' import { emptySplitApi } from './api.store' import { setupListeners } from '@reduxjs/toolkit/query' const getReducers = () => { return combineReducers({ - userReducer, + loginPageReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer }) } @@ -20,4 +20,5 @@ export const store = configureStore({ setupListeners(store.dispatch) -//export type RootState = ReturnType<typeof store.getState> \ No newline at end of file +export type RootState = ReturnType<typeof store.getState>; +export type AppDispatch = typeof store.dispatch; \ No newline at end of file diff --git a/react-ui/src/stores/slices/login.reducer.ts b/react-ui/src/stores/slices/login.reducer.ts new file mode 100644 index 000000000..87b11357b --- /dev/null +++ b/react-ui/src/stores/slices/login.reducer.ts @@ -0,0 +1,26 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; + +export interface PageLoginState { + valid: boolean, + checked: boolean +} + + +const initialState: PageLoginState = { + valid: false, + checked: false, +} + + +const loginSlice = createSlice({ + name: 'page_login', + initialState, + reducers: { + setValidity: (state, action: PayloadAction<boolean>) => + {state.valid = action.payload, state.checked = true}, + }, +}) + +export const { setValidity: setLoginFormValidity } = loginSlice.actions + +export default loginSlice.reducer diff --git a/react-ui/src/stores/slices/user.reducer.ts b/react-ui/src/stores/slices/user.reducer.ts deleted file mode 100644 index 8f0b49812..000000000 --- a/react-ui/src/stores/slices/user.reducer.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit' -import { RootState } from '@reduxjs/toolkit/query'; -import { RbacUser } from 'src/api' - -export type UserType = RbacUser; - - -interface UserState { - user: UserType | undefined -} - - -const initialState: UserState = { - user: undefined -} - - -const userSlice = createSlice({ - name: 'user', - initialState, - reducers: { - set: (state, action: PayloadAction<UserType>) => - {state.user = action.payload}, - }, -}) - -export const { set } = userSlice.actions - -//export const getUser = (state: RootState) => state.counter.value - -export default userSlice.reducer diff --git a/react-ui/src/style/box.scss b/react-ui/src/style/box.scss index e2782bca2..e705404c9 100644 --- a/react-ui/src/style/box.scss +++ b/react-ui/src/style/box.scss @@ -1,8 +1,20 @@ +@import './colors.scss'; + +$box-padding: 10px; +$border-radius: 10px; + + .c-box { + padding: $box-padding; background-color: white; - - border-radius: 10px; box-shadow: 0px 4px 4px rgba(0,0,0, .35); + border-radius: $border-radius; +} + +.danger-box { + background-color: map-get($theme-colors, 'danger') !important; + border-radius: calc($border-radius / 2); - padding: 5px; + padding: 16px $box-padding; + font-size: .90em; } \ No newline at end of file diff --git a/react-ui/src/style/colors.scss b/react-ui/src/style/colors.scss new file mode 100644 index 000000000..1f11a48f3 --- /dev/null +++ b/react-ui/src/style/colors.scss @@ -0,0 +1,7 @@ +$theme-colors: ( + 'primary': #b350e0, + 'bg-primary': #E1E1E1, + 'danger': #ffdcdc, +); + +@import '/node_modules/bootstrap/scss/bootstrap'; diff --git a/react-ui/src/style/fonts.scss b/react-ui/src/style/fonts.scss new file mode 100644 index 000000000..b5f7ec4e6 --- /dev/null +++ b/react-ui/src/style/fonts.scss @@ -0,0 +1,8 @@ +@font-face { + font-family: inter_font; + src: url("./fonts/Inter.ttf"); +} + +* { + font-family: inter_font; +} \ No newline at end of file diff --git a/react-ui/src/style/index.scss b/react-ui/src/style/index.scss new file mode 100644 index 000000000..47dd70b60 --- /dev/null +++ b/react-ui/src/style/index.scss @@ -0,0 +1,4 @@ +@import "./fonts.scss"; +@import './colors.scss'; +@import './utils.scss'; +@import './box.scss'; diff --git a/react-ui/src/style/style.scss b/react-ui/src/style/style.scss deleted file mode 100644 index 2d8649fd4..000000000 --- a/react-ui/src/style/style.scss +++ /dev/null @@ -1,10 +0,0 @@ -@import './box.scss'; -@import './utils.scss'; - - -$theme-colors: ( - 'primary': #b350e0, - 'bg-primary': #E1E1E1 - ); - - @import '/node_modules/bootstrap/scss/bootstrap'; \ No newline at end of file -- GitLab From 0b9f2b24a20fd6e85d294cc1eaf04b53a1c0095d Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 8 Jul 2024 12:05:32 +0200 Subject: [PATCH 10/78] added mvvm pattern --- .../view}/landingpage/landingpage.scss | 0 .../view}/landingpage/landingpage.tsx | 0 .../view}/login/login.scss | 0 .../view}/login/login.tsx | 74 +++++-------------- .../components/view_model/login.viewmodel.ts | 58 +++++++++++++++ react-ui/src/index.scss | 3 - react-ui/src/index.tsx | 4 +- .../pages/landingpage/landingpage.test.tsx | 9 --- react-ui/src/pages/login/login.test.tsx | 9 --- react-ui/src/stores/index.ts | 2 +- .../{slices => reducer}/login.reducer.ts | 4 +- react-ui/tsconfig.json | 3 + react-ui/vite.config.mjs | 3 + 13 files changed, 88 insertions(+), 81 deletions(-) rename react-ui/src/{pages => components/view}/landingpage/landingpage.scss (100%) rename react-ui/src/{pages => components/view}/landingpage/landingpage.tsx (100%) rename react-ui/src/{pages => components/view}/login/login.scss (100%) rename react-ui/src/{pages => components/view}/login/login.tsx (54%) create mode 100644 react-ui/src/components/view_model/login.viewmodel.ts delete mode 100644 react-ui/src/pages/landingpage/landingpage.test.tsx delete mode 100644 react-ui/src/pages/login/login.test.tsx rename react-ui/src/stores/{slices => reducer}/login.reducer.ts (75%) diff --git a/react-ui/src/pages/landingpage/landingpage.scss b/react-ui/src/components/view/landingpage/landingpage.scss similarity index 100% rename from react-ui/src/pages/landingpage/landingpage.scss rename to react-ui/src/components/view/landingpage/landingpage.scss diff --git a/react-ui/src/pages/landingpage/landingpage.tsx b/react-ui/src/components/view/landingpage/landingpage.tsx similarity index 100% rename from react-ui/src/pages/landingpage/landingpage.tsx rename to react-ui/src/components/view/landingpage/landingpage.tsx diff --git a/react-ui/src/pages/login/login.scss b/react-ui/src/components/view/login/login.scss similarity index 100% rename from react-ui/src/pages/login/login.scss rename to react-ui/src/components/view/login/login.scss diff --git a/react-ui/src/pages/login/login.tsx b/react-ui/src/components/view/login/login.tsx similarity index 54% rename from react-ui/src/pages/login/login.tsx rename to react-ui/src/components/view/login/login.tsx index 24842bab1..d86ed0819 100644 --- a/react-ui/src/pages/login/login.tsx +++ b/react-ui/src/components/view/login/login.tsx @@ -2,73 +2,37 @@ import { Button, Col, Container, Form, Image, Row } from 'react-bootstrap' import { useTranslation } from 'react-i18next' import './login.scss' -import { AuthServiceLoginApiArg, useAuthServiceLoginMutation } from '@api/api' import logo from '@assets/logo.svg' -import React, { useRef, useState } from 'react' -import { PageLoginState } from 'src/stores/slices/login.reducer' -import { useDispatch, useSelector } from 'react-redux' -import { AppDispatch } from 'src/stores' +import React, { useRef } from 'react' +import useLoginViewModel from '@viewmodel/login.viewmodel' -/** - * The `/login` page. It renders the login form with all the encapsulated business logic - * - * @description The store is getting mutated by a successful login - */ const LoginPage = () => { const { t } = useTranslation('common') + const { checked, valid, login } = useLoginViewModel(); + const usernameRef = useRef<HTMLInputElement>(null) const passwordRef = useRef<HTMLInputElement>(null) - const [validated, setValidated] = useState(false); - const [valid, checked] = useSelector((state: PageLoginState) => state); - const {setLoginFormValidity} = useDispatch<AppDispatch>(); - - const [ - sendLogin, - ] = useAuthServiceLoginMutation() - - - const isInputValid = (username: string | undefined, password: string | undefined): boolean => { - return !!username && !!password; - } + const triggerLogin = (event: React.FormEvent<HTMLFormElement>) => { + event.preventDefault(); + const username = usernameRef.current?.value; + const password = passwordRef.current?.value; - /** - * Returns the /login payload - */ - const getAuthPayload = (username: string, password: string): AuthServiceLoginApiArg => { - const payload: AuthServiceLoginApiArg = { - rbacLoginRequest: { - username: username, - pwd: password, - timestamp: new Date().getTime().toString(), - } + if (!username || !password) { + return; } - return payload; + login(username, password); } - /** - * Tries to `/login` by using the input fields. - * - * @description The fields are getting validated against null values - * @param event Submit event - */ - const login = (event: React.FormEvent<HTMLFormElement>) => { - event.preventDefault() - const username = usernameRef.current?.value - const password = passwordRef.current?.value - - setValidated(true); - const inputInvalid = !isInputValid(username, password); - setLoginFormValidity(inputInvalid) - if (inputInvalid) { + const handleErrorMessageRendering = () => { + if (!checked || valid) { return; } - - const authPayload = getAuthPayload(username!, password!); - sendLogin(authPayload).unwrap() - .then((payload) => console.log('fulfilled', payload)) - .catch((error) => console.error('rejected', error)); + + return ( + <div className="danger-box">{t('login.form.failed')}</div> + ) } return ( @@ -80,9 +44,9 @@ const LoginPage = () => { <Col md={6} sm={10} className="c-box p-4"> <h1 className="text-center h2">goSDN - Web</h1> - <div className="danger-box">{t('login.form.failed')}</div> + {handleErrorMessageRendering()} - <Form className="mt-4" noValidate validated={validated} onSubmit={login}> + <Form className="mt-4" noValidate validated={checked} onSubmit={triggerLogin}> <Form.Group className="mb-3" controlId="loginForm.username" diff --git a/react-ui/src/components/view_model/login.viewmodel.ts b/react-ui/src/components/view_model/login.viewmodel.ts new file mode 100644 index 000000000..d69fa98d6 --- /dev/null +++ b/react-ui/src/components/view_model/login.viewmodel.ts @@ -0,0 +1,58 @@ +import { AuthServiceLoginApiArg, useAuthServiceLoginMutation } from "@api/api"; +import { setLoginFormValidity } from "@reducer/login.reducer"; +import { useDispatch, useSelector } from "react-redux"; +import { AppDispatch, RootState } from "src/stores"; + +export default function useLoginViewModel() { + const {valid, checked} = useSelector((state: RootState) => state.loginPageReducer); + const dispatch = useDispatch<AppDispatch>(); + + const [ + sendLogin, + ] = useAuthServiceLoginMutation() + + + const isInputValid = (username: string | undefined, password: string | undefined): boolean => { + return !!username && !!password; + } + + /** + * Returns the /login payload + */ + const getAuthPayload = (username: string, password: string): AuthServiceLoginApiArg => { + const payload: AuthServiceLoginApiArg = { + rbacLoginRequest: { + username: username, + pwd: password, + timestamp: new Date().getTime().toString(), + } + } + + return payload; + } + + /** + * Tries to `/login` by using the input fields. + * + * @description The fields are getting validated against null values + * @param event Submit event + */ + const login = (username: string, password: string) => { + const inputInvalid = !isInputValid(username, password); + dispatch(setLoginFormValidity(inputInvalid)) + if (inputInvalid) { + return; + } + + const authPayload = getAuthPayload(username!, password!); + sendLogin(authPayload).unwrap() + .then((payload) => console.log('fulfilled', payload)) + .catch((error) => console.error('rejected', error)); + } + + return { + login, + valid, + checked + } +} diff --git a/react-ui/src/index.scss b/react-ui/src/index.scss index 9774d5bd6..3526e18bc 100644 --- a/react-ui/src/index.scss +++ b/react-ui/src/index.scss @@ -2,9 +2,6 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 6c95d80aa..0bd142250 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -8,8 +8,8 @@ import { createRoutesFromElements, } from 'react-router-dom' import './index.scss' -import Landingpage from './pages/landingpage/landingpage' -import LoginPage from './pages/login/login' +import Landingpage from './components/view/landingpage/landingpage' +import LoginPage from './components/view/login/login' import './i18n/config' import { I18nextProvider } from 'react-i18next' diff --git a/react-ui/src/pages/landingpage/landingpage.test.tsx b/react-ui/src/pages/landingpage/landingpage.test.tsx deleted file mode 100644 index b3f1713e2..000000000 --- a/react-ui/src/pages/landingpage/landingpage.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { render, screen } from '@testing-library/react' -import Landingpage from './landingpage' -import React from 'react' - -test('renders learn react link', () => { - render(<Landingpage />) - const linkElement = screen.getByText(/learn react/i) - expect(linkElement).toBeInTheDocument() -}) diff --git a/react-ui/src/pages/login/login.test.tsx b/react-ui/src/pages/login/login.test.tsx deleted file mode 100644 index 7bdf84514..000000000 --- a/react-ui/src/pages/login/login.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { render, screen } from '@testing-library/react' -import App from './login' -import React from 'react' - -test('renders learn react link', () => { - render(<App />) - const linkElement = screen.getByText(/learn react/i) - expect(linkElement).toBeInTheDocument() -}) diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index 28a3e5300..26d3cde46 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,5 +1,5 @@ import { combineReducers } from 'redux' -import loginPageReducer from './slices/login.reducer' +import loginPageReducer from './reducer/login.reducer' import { configureStore } from '@reduxjs/toolkit' import { emptySplitApi } from './api.store' import { setupListeners } from '@reduxjs/toolkit/query' diff --git a/react-ui/src/stores/slices/login.reducer.ts b/react-ui/src/stores/reducer/login.reducer.ts similarity index 75% rename from react-ui/src/stores/slices/login.reducer.ts rename to react-ui/src/stores/reducer/login.reducer.ts index 87b11357b..ec41bd1a3 100644 --- a/react-ui/src/stores/slices/login.reducer.ts +++ b/react-ui/src/stores/reducer/login.reducer.ts @@ -16,11 +16,11 @@ const loginSlice = createSlice({ name: 'page_login', initialState, reducers: { - setValidity: (state, action: PayloadAction<boolean>) => + setLoginFormValidity: (state, action: PayloadAction<boolean>) => {state.valid = action.payload, state.checked = true}, }, }) -export const { setValidity: setLoginFormValidity } = loginSlice.actions +export const { setLoginFormValidity } = loginSlice.actions export default loginSlice.reducer diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 4230ee19f..17feecac2 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -24,6 +24,9 @@ "paths": { "@assets/*": ["assets/*"], "@api/*": ["src/api/*"], + "@viewmodel/*": ["src/components/view_model/*"], + "@view/*": ["src/components/view/*"], + "@reducer/*": ["src/stores/reducer/*"], } }, "include": [ diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 4d70f80f3..0e2caf6fd 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -30,6 +30,9 @@ export default defineConfig({ alias: { '@assets': '/assets', '@api': '/src/api', + "@viewmodel": "/src/components/view_model", + "@view": "/src/components/view", + "@reducer": "/src/stores/reducer", }, }, -- GitLab From af5cc3ce85820e0a89264d088a2135cf3419b609 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 6 Aug 2024 14:32:08 +0200 Subject: [PATCH 11/78] move error logic to viewmodel --- react-ui/package.json | 2 + react-ui/scripts/openapi-config.json | 4 +- react-ui/scripts/test.ts | 1208 ----------------- react-ui/src/components/view/login/login.tsx | 26 +- .../components/view_model/login.viewmodel.ts | 58 +- react-ui/src/index.tsx | 19 +- react-ui/src/router.tsx | 169 --- react-ui/src/stores/api.store.ts | 13 +- react-ui/src/stores/index.ts | 31 +- .../middleware/devLogging.middleware.ts | 24 + react-ui/src/stores/persist.store.ts | 25 + react-ui/src/stores/reducer/login.reducer.ts | 44 +- react-ui/src/stores/reducer/user.reducer.ts | 24 + react-ui/src/style/index.scss | 1 + react-ui/src/style/toast.scss | 1 + react-ui/yarn.lock | 17 + 16 files changed, 223 insertions(+), 1443 deletions(-) delete mode 100644 react-ui/scripts/test.ts delete mode 100644 react-ui/src/router.tsx create mode 100644 react-ui/src/stores/middleware/devLogging.middleware.ts create mode 100644 react-ui/src/stores/persist.store.ts create mode 100644 react-ui/src/stores/reducer/user.reducer.ts create mode 100644 react-ui/src/style/toast.scss diff --git a/react-ui/package.json b/react-ui/package.json index f2d15cd7c..0484b6822 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -16,7 +16,9 @@ "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", "react-scripts": "5.0.1", + "react-toastify": "^10.0.5", "redux": "^5.0.1", + "redux-persist": "^6.0.0", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/react-ui/scripts/openapi-config.json b/react-ui/scripts/openapi-config.json index 1aa05ba6e..f4246e548 100644 --- a/react-ui/scripts/openapi-config.json +++ b/react-ui/scripts/openapi-config.json @@ -4,5 +4,7 @@ "apiImport": "emptySplitApi", "outputFile": "../src/api/api.ts", "exportName": "api", - "hooks": true + "hooks": true, + "nullSafeAdditionalProps": true, + "withInterfaces": true } \ No newline at end of file diff --git a/react-ui/scripts/test.ts b/react-ui/scripts/test.ts deleted file mode 100644 index 775438e48..000000000 --- a/react-ui/scripts/test.ts +++ /dev/null @@ -1,1208 +0,0 @@ -import { emptySplitApi as api } from '../src/stores/api.store' -const injectedRtkApi = api.injectEndpoints({ - endpoints: (build) => ({ - appServiceDeregister: build.mutation< - AppServiceDeregisterApiResponse, - AppServiceDeregisterApiArg - >({ - query: (queryArg) => ({ - url: `/deregister`, - method: 'POST', - body: queryArg.appAppDeregisterRequest, - }), - }), - configurationManagementServiceExportSdnConfig: build.query< - ConfigurationManagementServiceExportSdnConfigApiResponse, - ConfigurationManagementServiceExportSdnConfigApiArg - >({ - query: (queryArg) => ({ - url: `/export/${queryArg.pid}`, - params: { timestamp: queryArg.timestamp }, - }), - }), - configurationManagementServiceImportSdnConfig: build.mutation< - ConfigurationManagementServiceImportSdnConfigApiResponse, - ConfigurationManagementServiceImportSdnConfigApiArg - >({ - query: (queryArg) => ({ - url: `/import/${queryArg.pid}`, - method: 'POST', - params: { - timestamp: queryArg.timestamp, - sdnConfigData: queryArg.sdnConfigData, - }, - }), - }), - authServiceLogin: build.mutation< - AuthServiceLoginApiResponse, - AuthServiceLoginApiArg - >({ - query: (queryArg) => ({ - url: `/login`, - method: 'POST', - body: queryArg.rbacLoginRequest, - }), - }), - authServiceLogout: build.mutation< - AuthServiceLogoutApiResponse, - AuthServiceLogoutApiArg - >({ - query: (queryArg) => ({ - url: `/logout/${queryArg.username}`, - method: 'POST', - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceUpdate: build.mutation< - NetworkElementServiceUpdateApiResponse, - NetworkElementServiceUpdateApiArg - >({ - query: (queryArg) => ({ - url: `/network-element/update`, - method: 'POST', - body: queryArg.networkelementUpdateNetworkElementRequest, - }), - }), - pndServiceGetPnd: build.query< - PndServiceGetPndApiResponse, - PndServiceGetPndApiArg - >({ - query: (queryArg) => ({ - url: `/pnd/${queryArg.pid}`, - params: { timestamp: queryArg.timestamp }, - }), - }), - pndServiceGetPndList: build.query< - PndServiceGetPndListApiResponse, - PndServiceGetPndListApiArg - >({ - query: (queryArg) => ({ - url: `/pnds`, - params: { timestamp: queryArg.timestamp }, - }), - }), - pndServiceCreatePndList: build.mutation< - PndServiceCreatePndListApiResponse, - PndServiceCreatePndListApiArg - >({ - query: (queryArg) => ({ - url: `/pnds`, - method: 'POST', - body: queryArg.pndCreatePndListRequest, - }), - }), - pndServiceDeletePnd: build.mutation< - PndServiceDeletePndApiResponse, - PndServiceDeletePndApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}`, - method: 'DELETE', - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceGetChangeList: build.query< - NetworkElementServiceGetChangeListApiResponse, - NetworkElementServiceGetChangeListApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/changes`, - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceSetChangeList: build.mutation< - NetworkElementServiceSetChangeListApiResponse, - NetworkElementServiceSetChangeListApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/changes`, - method: 'POST', - body: queryArg.networkElementServiceSetChangeListBody, - }), - }), - networkElementServiceGetChange: build.query< - NetworkElementServiceGetChangeApiResponse, - NetworkElementServiceGetChangeApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/changes/${queryArg.cuid}`, - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceGet: build.query< - NetworkElementServiceGetApiResponse, - NetworkElementServiceGetApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/mne/${queryArg.mneid}`, - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceGetAllFlattened: build.query< - NetworkElementServiceGetAllFlattenedApiResponse, - NetworkElementServiceGetAllFlattenedApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/mnes`, - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceAddList: build.mutation< - NetworkElementServiceAddListApiResponse, - NetworkElementServiceAddListApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/mnes`, - method: 'POST', - body: queryArg.networkElementServiceAddListBody, - }), - }), - networkElementServiceSetPathList: build.mutation< - NetworkElementServiceSetPathListApiResponse, - NetworkElementServiceSetPathListApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/mnes/paths`, - method: 'POST', - body: queryArg.networkElementServiceSetPathListBody, - }), - }), - networkElementServiceDelete: build.mutation< - NetworkElementServiceDeleteApiResponse, - NetworkElementServiceDeleteApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/mnes/${queryArg.mneid}`, - method: 'DELETE', - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceGetIntendedPath: build.query< - NetworkElementServiceGetIntendedPathApiResponse, - NetworkElementServiceGetIntendedPathApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/mnes/${queryArg.mneid}/intendedpaths/${queryArg.intendedPath}`, - params: { timestamp: queryArg.timestamp }, - }), - }), - networkElementServiceGetPath: build.query< - NetworkElementServiceGetPathApiResponse, - NetworkElementServiceGetPathApiArg - >({ - query: (queryArg) => ({ - url: `/pnds/${queryArg.pid}/mnes/${queryArg.mneid}/paths/${queryArg.path}`, - params: { timestamp: queryArg.timestamp }, - }), - }), - appServiceRegister: build.mutation< - AppServiceRegisterApiResponse, - AppServiceRegisterApiArg - >({ - query: (queryArg) => ({ - url: `/register`, - method: 'POST', - body: queryArg.appAppRegisterRequest, - }), - }), - roleServiceGetRoles: build.query< - RoleServiceGetRolesApiResponse, - RoleServiceGetRolesApiArg - >({ - query: (queryArg) => ({ - url: `/roles`, - params: { timestamp: queryArg.timestamp }, - }), - }), - roleServiceCreateRoles: build.mutation< - RoleServiceCreateRolesApiResponse, - RoleServiceCreateRolesApiArg - >({ - query: (queryArg) => ({ - url: `/roles/create`, - method: 'POST', - body: queryArg.rbacCreateRolesRequest, - }), - }), - roleServiceDeleteRoles: build.mutation< - RoleServiceDeleteRolesApiResponse, - RoleServiceDeleteRolesApiArg - >({ - query: (queryArg) => ({ - url: `/roles/delete`, - method: 'DELETE', - params: { - timestamp: queryArg.timestamp, - roleName: queryArg.roleName, - }, - }), - }), - roleServiceDeletePermissionsForRole: build.mutation< - RoleServiceDeletePermissionsForRoleApiResponse, - RoleServiceDeletePermissionsForRoleApiArg - >({ - query: (queryArg) => ({ - url: `/roles/delete/permissions`, - method: 'DELETE', - params: { - timestamp: queryArg.timestamp, - roleName: queryArg.roleName, - permissionsToDelete: queryArg.permissionsToDelete, - }, - }), - }), - roleServiceGetRole: build.query< - RoleServiceGetRoleApiResponse, - RoleServiceGetRoleApiArg - >({ - query: (queryArg) => ({ - url: `/roles/get`, - params: { - timestamp: queryArg.timestamp, - roleName: queryArg.roleName, - id: queryArg.id, - }, - }), - }), - roleServiceUpdateRoles: build.mutation< - RoleServiceUpdateRolesApiResponse, - RoleServiceUpdateRolesApiArg - >({ - query: (queryArg) => ({ - url: `/roles/update`, - method: 'POST', - body: queryArg.rbacUpdateRolesRequest, - }), - }), - routingTableServiceGetRoutes: build.query< - RoutingTableServiceGetRoutesApiResponse, - RoutingTableServiceGetRoutesApiArg - >({ - query: (queryArg) => ({ - url: `/routing`, - params: { timestamp: queryArg.timestamp }, - }), - }), - routingTableServiceAddRoutingTable: build.mutation< - RoutingTableServiceAddRoutingTableApiResponse, - RoutingTableServiceAddRoutingTableApiArg - >({ - query: (queryArg) => ({ - url: `/routing/create`, - method: 'POST', - body: queryArg.topologyAddRoutingTableRequest, - }), - }), - routingTableServiceDeleteRoute: build.mutation< - RoutingTableServiceDeleteRouteApiResponse, - RoutingTableServiceDeleteRouteApiArg - >({ - query: (queryArg) => ({ - url: `/routing/delete`, - method: 'DELETE', - params: { timestamp: queryArg.timestamp, id: queryArg.id }, - }), - }), - topologyServiceGetTopology: build.query< - TopologyServiceGetTopologyApiResponse, - TopologyServiceGetTopologyApiArg - >({ - query: (queryArg) => ({ - url: `/topology`, - params: { timestamp: queryArg.timestamp }, - }), - }), - topologyServiceAddLink: build.mutation< - TopologyServiceAddLinkApiResponse, - TopologyServiceAddLinkApiArg - >({ - query: (queryArg) => ({ - url: `/topology/create`, - method: 'POST', - body: queryArg.topologyAddLinkRequest, - }), - }), - topologyServiceDeleteLink: build.mutation< - TopologyServiceDeleteLinkApiResponse, - TopologyServiceDeleteLinkApiArg - >({ - query: (queryArg) => ({ - url: `/topology/delete`, - method: 'DELETE', - params: { timestamp: queryArg.timestamp, id: queryArg.id }, - }), - }), - topologyServiceUpdateLink: build.mutation< - TopologyServiceUpdateLinkApiResponse, - TopologyServiceUpdateLinkApiArg - >({ - query: (queryArg) => ({ - url: `/topology/update`, - method: 'POST', - body: queryArg.topologyUpdateLinkRequest, - }), - }), - userServiceGetUsers: build.query< - UserServiceGetUsersApiResponse, - UserServiceGetUsersApiArg - >({ - query: (queryArg) => ({ - url: `/users`, - params: { timestamp: queryArg.timestamp }, - }), - }), - userServiceCreateUsers: build.mutation< - UserServiceCreateUsersApiResponse, - UserServiceCreateUsersApiArg - >({ - query: (queryArg) => ({ - url: `/users/create`, - method: 'POST', - body: queryArg.rbacCreateUsersRequest, - }), - }), - userServiceDeleteUsers: build.mutation< - UserServiceDeleteUsersApiResponse, - UserServiceDeleteUsersApiArg - >({ - query: (queryArg) => ({ - url: `/users/delete`, - method: 'DELETE', - params: { - timestamp: queryArg.timestamp, - username: queryArg.username, - }, - }), - }), - userServiceGetUser: build.query< - UserServiceGetUserApiResponse, - UserServiceGetUserApiArg - >({ - query: (queryArg) => ({ - url: `/users/get`, - params: { - timestamp: queryArg.timestamp, - name: queryArg.name, - id: queryArg.id, - }, - }), - }), - userServiceUpdateUsers: build.mutation< - UserServiceUpdateUsersApiResponse, - UserServiceUpdateUsersApiArg - >({ - query: (queryArg) => ({ - url: `/users/update`, - method: 'POST', - body: queryArg.rbacUpdateUsersRequest, - }), - }), - }), - overrideExisting: false, -}) -export { injectedRtkApi as api } -export type AppServiceDeregisterApiResponse = - /** status 200 A successful response. */ AppAppDeregisterResponse -export type AppServiceDeregisterApiArg = { - appAppDeregisterRequest: AppAppDeregisterRequest -} -export type ConfigurationManagementServiceExportSdnConfigApiResponse = - /** status 200 A successful response. */ ConfigurationmanagementExportSdnConfigResponse -export type ConfigurationManagementServiceExportSdnConfigApiArg = { - pid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type ConfigurationManagementServiceImportSdnConfigApiResponse = - /** status 200 A successful response. */ ConfigurationmanagementImportSdnConfigResponse -export type ConfigurationManagementServiceImportSdnConfigApiArg = { - pid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - sdnConfigData?: string -} -export type AuthServiceLoginApiResponse = - /** status 200 A successful response. */ RbacLoginResponse -export type AuthServiceLoginApiArg = { - rbacLoginRequest: Login -} -export type AuthServiceLogoutApiResponse = - /** status 200 A successful response. */ RbacLogoutResponse -export type AuthServiceLogoutApiArg = { - username: string - timestamp?: string -} -export type NetworkElementServiceUpdateApiResponse = - /** status 200 A successful response. */ NetworkelementUpdateNetworkElementResponse -export type NetworkElementServiceUpdateApiArg = { - networkelementUpdateNetworkElementRequest: TodoChangeNameToFitTheRest -} -export type PndServiceGetPndApiResponse = - /** status 200 A successful response. */ PndGetPndResponse -export type PndServiceGetPndApiArg = { - pid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type PndServiceGetPndListApiResponse = - /** status 200 A successful response. */ PndGetPndListResponse -export type PndServiceGetPndListApiArg = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type PndServiceCreatePndListApiResponse = - /** status 200 A successful response. */ PndCreatePndListResponse -export type PndServiceCreatePndListApiArg = { - pndCreatePndListRequest: PndCreatePndListRequest -} -export type PndServiceDeletePndApiResponse = - /** status 200 A successful response. */ PndDeletePndResponse -export type PndServiceDeletePndApiArg = { - pid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkElementServiceGetChangeListApiResponse = - /** status 200 A successful response. */ NetworkelementGetChangeListResponse -export type NetworkElementServiceGetChangeListApiArg = { - pid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkElementServiceSetChangeListApiResponse = - /** status 200 A successful response. */ NetworkelementSetChangeListResponse -export type NetworkElementServiceSetChangeListApiArg = { - pid: string - networkElementServiceSetChangeListBody: NetworkElementServiceSetChangeListBody -} -export type NetworkElementServiceGetChangeApiResponse = - /** status 200 A successful response. */ NetworkelementGetChangeResponse -export type NetworkElementServiceGetChangeApiArg = { - pid: string - cuid: string[] - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkElementServiceGetApiResponse = - /** status 200 A successful response. */ GosdnnetworkelementGetResponse -export type NetworkElementServiceGetApiArg = { - pid: string - mneid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkElementServiceGetAllFlattenedApiResponse = - /** status 200 A successful response. */ NetworkelementGetAllFlattenedResponse -export type NetworkElementServiceGetAllFlattenedApiArg = { - pid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkElementServiceAddListApiResponse = - /** status 200 A successful response. */ NetworkelementAddListResponse -export type NetworkElementServiceAddListApiArg = { - pid: string - networkElementServiceAddListBody: NetworkElementServiceAddListBody -} -export type NetworkElementServiceSetPathListApiResponse = - /** status 200 A successful response. */ NetworkelementSetPathListResponse -export type NetworkElementServiceSetPathListApiArg = { - pid: string - networkElementServiceSetPathListBody: NetworkElementServiceSetPathListBody -} -export type NetworkElementServiceDeleteApiResponse = - /** status 200 A successful response. */ GosdnnetworkelementDeleteResponse -export type NetworkElementServiceDeleteApiArg = { - pid: string - mneid: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkElementServiceGetIntendedPathApiResponse = - /** status 200 A successful response. */ NetworkelementGetIntendedPathResponse -export type NetworkElementServiceGetIntendedPathApiArg = { - pid: string - mneid: string - intendedPath: string - timestamp?: string -} -export type NetworkElementServiceGetPathApiResponse = - /** status 200 A successful response. */ NetworkelementGetPathResponse -export type NetworkElementServiceGetPathApiArg = { - pid: string - mneid: string - path: string - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type AppServiceRegisterApiResponse = - /** status 200 A successful response. */ AppAppRegisterResponse -export type AppServiceRegisterApiArg = { - appAppRegisterRequest: AppAppRegisterRequest -} -export type RoleServiceGetRolesApiResponse = - /** status 200 A successful response. */ RbacGetRolesResponse -export type RoleServiceGetRolesApiArg = { - timestamp?: string -} -export type RoleServiceCreateRolesApiResponse = - /** status 200 A successful response. */ RbacCreateRolesResponse -export type RoleServiceCreateRolesApiArg = { - rbacCreateRolesRequest: CreateRoles -} -export type RoleServiceDeleteRolesApiResponse = - /** status 200 A successful response. */ RbacDeleteRolesResponse -export type RoleServiceDeleteRolesApiArg = { - timestamp?: string - roleName?: string[] -} -export type RoleServiceDeletePermissionsForRoleApiResponse = - /** status 200 A successful response. */ RbacDeletePermissionsForRoleResponse -export type RoleServiceDeletePermissionsForRoleApiArg = { - timestamp?: string - roleName?: string - permissionsToDelete?: string[] -} -export type RoleServiceGetRoleApiResponse = - /** status 200 A successful response. */ RbacGetRoleResponse -export type RoleServiceGetRoleApiArg = { - timestamp?: string - roleName?: string - id?: string -} -export type RoleServiceUpdateRolesApiResponse = - /** status 200 A successful response. */ RbacUpdateRolesResponse -export type RoleServiceUpdateRolesApiArg = { - rbacUpdateRolesRequest: UpdateRoles -} -export type RoutingTableServiceGetRoutesApiResponse = - /** status 200 A successful response. */ TopologyGetRoutesResponse -export type RoutingTableServiceGetRoutesApiArg = { - timestamp?: string -} -export type RoutingTableServiceAddRoutingTableApiResponse = - /** status 200 A successful response. */ TopologyAddRoutingTableResponse -export type RoutingTableServiceAddRoutingTableApiArg = { - topologyAddRoutingTableRequest: TopologyAddRoutingTableRequest -} -export type RoutingTableServiceDeleteRouteApiResponse = - /** status 200 A successful response. */ TopologyDeleteRoutesResponse -export type RoutingTableServiceDeleteRouteApiArg = { - timestamp?: string - id?: string -} -export type TopologyServiceGetTopologyApiResponse = - /** status 200 A successful response. */ TopologyGetTopologyResponse -export type TopologyServiceGetTopologyApiArg = { - timestamp?: string -} -export type TopologyServiceAddLinkApiResponse = - /** status 200 A successful response. */ TopologyAddLinkResponse -export type TopologyServiceAddLinkApiArg = { - topologyAddLinkRequest: TopologyAddLinkRequest -} -export type TopologyServiceDeleteLinkApiResponse = - /** status 200 A successful response. */ TopologyDeleteLinkResponse -export type TopologyServiceDeleteLinkApiArg = { - timestamp?: string - id?: string -} -export type TopologyServiceUpdateLinkApiResponse = - /** status 200 A successful response. */ TopologyUpdateLinkResponse -export type TopologyServiceUpdateLinkApiArg = { - topologyUpdateLinkRequest: TopologyUpdateLinkRequest -} -export type UserServiceGetUsersApiResponse = - /** status 200 A successful response. */ RbacGetUsersResponse -export type UserServiceGetUsersApiArg = { - timestamp?: string -} -export type UserServiceCreateUsersApiResponse = - /** status 200 A successful response. */ RbacCreateUsersResponse -export type UserServiceCreateUsersApiArg = { - rbacCreateUsersRequest: CreateUsers -} -export type UserServiceDeleteUsersApiResponse = - /** status 200 A successful response. */ RbacDeleteUsersResponse -export type UserServiceDeleteUsersApiArg = { - timestamp?: string - username?: string[] -} -export type UserServiceGetUserApiResponse = - /** status 200 A successful response. */ RbacGetUserResponse -export type UserServiceGetUserApiArg = { - timestamp?: string - /** TODO(faseid): reconsider if this is necessary as required, but id is not? */ - name?: string - id?: string -} -export type UserServiceUpdateUsersApiResponse = - /** status 200 A successful response. */ RbacUpdateUsersResponse -export type UserServiceUpdateUsersApiArg = { - rbacUpdateUsersRequest: UpdateUsers -} -export type AppAppDeregisterResponse = { - timestamp?: string -} -export type ProtobufAny = { - /** A URL/resource name that uniquely identifies the type of the serialized - protocol buffer message. This string must contain at least - one "/" character. The last segment of the URL's path must represent - the fully qualified name of the type (as in - `path/google.protobuf.Duration`). The name should be in a canonical form - (e.g., leading "." is not accepted). - - In practice, teams usually precompile into the binary all types that they - expect it to use in the context of Any. However, for URLs which use the - scheme `http`, `https`, or no scheme, one can optionally set up a type - server that maps type URLs to message definitions as follows: - - * If no scheme is provided, `https` is assumed. - * An HTTP GET on the URL must yield a [google.protobuf.Type][] - value in binary format, or produce an error. - * Applications are allowed to cache lookup results based on the - URL, or have them precompiled into a binary to avoid any - lookup. Therefore, binary compatibility needs to be preserved - on changes to types. (Use versioned type names to manage - breaking changes.) - - Note: this functionality is not currently available in the official - protobuf release, and it is not used for type URLs beginning with - type.googleapis.com. As of May 2023, there are no widely used type server - implementations and no plans to implement one. - - Schemes other than `http`, `https` (or the empty scheme) might be - used with implementation specific semantics. */ - '@type'?: string - [key: string]: any -} -export type GooglerpcStatus = { - code?: number - message?: string - details?: ProtobufAny[] -} -export type AppAppDeregisterRequest = { - timestamp?: string - appname?: string -} -export type ConfigurationmanagementExportSdnConfigResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - sdnConfigData?: string -} -export type ConfigurationmanagementImportSdnConfigResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type RbacLoginResponse = { - timestamp?: string - token?: string -} -export type Login = { - timestamp?: string - username?: string - pwd?: string -} -export type RbacLogoutResponse = { - timestamp?: string -} -export type NetworkelementUpdateNetworkElementResponse = { - timestamp?: string -} -export type PluginRegistryManifest = { - name?: string - firmware?: string - author?: string - version?: string -} -export type PluginRegistryPlugin = { - id?: string - manifest?: PluginRegistryManifest -} -export type GnmiPathElem = { - /** The name of the element in the path. */ - name?: string - /** Map of key (attribute) name to value. */ - key?: { - [key: string]: string - } -} -export type GnmiPath = { - /** Elements of the path are no longer encoded as a string, but rather within - the elem field as a PathElem message. */ - element?: string[] - /** Label to disambiguate path. */ - origin?: string - /** Elements of the path. */ - elem?: GnmiPathElem[] - target?: string -} -export type EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 = - 'JSON' | 'BYTES' | 'PROTO' | 'ASCII' | 'JSON_IETF' -export type GnmiValue = { - /** Value of the variable being transmitted. */ - value?: string - type?: EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 -} -export type GnmiDecimal64 = { - /** Set of digits. */ - digits?: string - /** Number of digits following the decimal point. */ - precision?: number -} -export type GnmiScalarArray = { - /** The set of elements within the array. Each TypedValue message should - specify only elements that have a field identifier of 1-7 (i.e., the - values are scalar values). */ - element?: GnmiTypedValue[] -} -export type GnmiTypedValue = { - /** String value. */ - stringVal?: string - /** Integer value. */ - intVal?: string - /** Unsigned integer value. */ - uintVal?: string - /** Bool value. */ - boolVal?: boolean - /** Arbitrary byte sequence value. */ - bytesVal?: string - /** Floating point value. */ - floatVal?: number - decimalVal?: GnmiDecimal64 - leaflistVal?: GnmiScalarArray - anyVal?: ProtobufAny - /** JSON-encoded text. */ - jsonVal?: string - /** JSON-encoded text per RFC7951. */ - jsonIetfVal?: string - /** Arbitrary ASCII text. */ - asciiVal?: string - /** Protobuf binary encoded bytes. The message type is not included. - See the specification at - github.com/openconfig/reference/blob/master/rpc/gnmi/protobuf-vals.md - for a complete specification. */ - protoBytes?: string -} -export type UpdateIsAReUsableMessageThatIsUsedToStoreAParticularPathValuePairReferenceGNmiSpecificationSection21 = - { - path?: GnmiPath - value?: GnmiValue - val?: GnmiTypedValue - /** Number of coalesced duplicates. */ - duplicates?: number - } -export type NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21 = - { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - prefix?: GnmiPath - alias?: string - /** Data elements that have changed values. */ - update?: UpdateIsAReUsableMessageThatIsUsedToStoreAParticularPathValuePairReferenceGNmiSpecificationSection21[] - /** Data elements that have been deleted. */ - delete?: GnmiPath[] - /** This notification contains a set of paths that are always updated together - referenced by a globally unique prefix. */ - atomic?: boolean - } -export type TransportGnmiTransportOption = { - compression?: string - grpcDialOptions?: { - [key: string]: string - } - token?: string - encoding?: EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 -} -export type TransportRestconfTransportOption = object -export type ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums = - - | 'TYPE_UNSPECIFIED' - | 'TYPE_OPENCONFIG' - | 'TYPE_CONTAINERISED' - | 'TYPE_PLUGIN' -export type TransportTransportOption = { - address?: string - username?: string - password?: string - tls?: boolean - gnmiTransportOption?: TransportGnmiTransportOption - restconfTransportOption?: TransportRestconfTransportOption - type?: ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums -} -export type ConflictMetadata = { - resourceVersion?: string -} -export type NetworkelementManagedNetworkElement = { - id?: string - name?: string - model?: string - plugin?: PluginRegistryPlugin - mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] - transportAddress?: string - transportOption?: TransportTransportOption - metadata?: ConflictMetadata - associatedPnd?: string - gnmiSubscribePaths?: string[] -} -export type TodoChangeNameToFitTheRest = { - timestamp?: string - networkElement?: NetworkelementManagedNetworkElement -} -export type PndPrincipalNetworkDomain = { - id?: string - name?: string - description?: string -} -export type PndGetPndResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPrincipalNetworkDomain -} -export type PndGetPndListResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPrincipalNetworkDomain[] -} -export type PndCreatePndListResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type PndPndCreateProperties = { - name?: string - description?: string -} -export type PndCreatePndListRequest = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPndCreateProperties[] -} -export type PndDeletePndResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkelementChangeState = - | 'CHANGE_STATE_UNSPECIFIED' - | 'CHANGE_STATE_PENDING' - | 'CHANGE_STATE_COMMITTED' - | 'CHANGE_STATE_CONFIRMED' - | 'CHANGE_STATE_INCONSISTENT' -export type NetworkelementChange = { - id?: string - age?: string - state?: NetworkelementChangeState - diff?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21 -} -export type NetworkelementGetChangeListResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPrincipalNetworkDomain - change?: NetworkelementChange[] -} -export type GosdnnetworkelementSetResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - id?: string -} -export type NetworkelementSetChangeListResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - responses?: GosdnnetworkelementSetResponse[] -} -export type GosdnnetworkelementOperation = - | 'OPERATION_UNSPECIFIED' - | 'OPERATION_CREATE' - | 'OPERATION_COMMIT' - | 'OPERATION_CONFIRM' -export type NetworkelementSetChange = { - cuid?: string - op?: GosdnnetworkelementOperation -} -export type NetworkElementServiceSetChangeListBody = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - change?: NetworkelementSetChange[] -} -export type NetworkelementGetChangeResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPrincipalNetworkDomain - change?: NetworkelementChange[] -} -export type GosdnnetworkelementGetResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPrincipalNetworkDomain - mne?: NetworkelementManagedNetworkElement -} -export type NetworkelementFlattenedManagedNetworkElement = { - id?: string - name?: string - pid?: string - pluginid?: string -} -export type NetworkelementGetAllFlattenedResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPrincipalNetworkDomain - mne?: NetworkelementFlattenedManagedNetworkElement[] -} -export type NetworkelementAddListResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - responses?: GosdnnetworkelementSetResponse[] -} -export type NetworkelementSetMne = { - address?: string - pid?: string - pluginId?: string - mneName?: string - transportOption?: TransportTransportOption - gnmiSubscribePaths?: string[] - mneId?: string -} -export type NetworkElementServiceAddListBody = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - mne?: NetworkelementSetMne[] -} -export type NetworkelementSetPathListResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - responses?: GosdnnetworkelementSetResponse[] -} -export type NetworkelementApiOperation = - | 'API_OPERATION_UNSPECIFIED' - | 'API_OPERATION_UPDATE' - | 'API_OPERATION_REPLACE' - | 'API_OPERATION_DELETE' -export type NetworkelementChangeRequest = { - mneid?: string - path?: GnmiPath - value?: GnmiTypedValue - apiOp?: NetworkelementApiOperation -} -export type NetworkElementServiceSetPathListBody = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - changeRequest?: NetworkelementChangeRequest[] -} -export type GosdnnetworkelementDeleteResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string -} -export type NetworkelementGetIntendedPathResponse = { - timestamp?: string - pnd?: PndPrincipalNetworkDomain - mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] -} -export type NetworkelementGetPathResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - pnd?: PndPrincipalNetworkDomain - mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] -} -export type AppAppRegisterResponse = { - timestamp?: string - queueconnection?: string -} -export type AppAppRegisterRequest = { - timestamp?: string - appname?: string - token?: string -} -export type GosdnrbacRole = { - id?: string - name?: string - description?: string - permissions?: string[] -} -export type RbacGetRolesResponse = { - timestamp?: string - roles?: GosdnrbacRole[] -} -export type RbacCreateRolesResponse = { - timestamp?: string -} -export type CreateRoles = { - timestamp?: string - roles?: GosdnrbacRole[] -} -export type RbacDeleteRolesResponse = { - timestamp?: string -} -export type RbacDeletePermissionsForRoleResponse = { - timestamp?: string -} -export type RbacGetRoleResponse = { - timestamp?: string - role?: GosdnrbacRole -} -export type RbacUpdateRolesResponse = { - timestamp?: string -} -export type UpdateRoles = { - timestamp?: string - roles?: GosdnrbacRole[] -} -export type TopologyRoute = { - id?: string - targetIPRange?: string - nextHopIP?: string - portID?: string - metric?: string -} -export type TopologyRoutingTable = { - id?: string - nodeID?: string - routes?: TopologyRoute[] - metadata?: ConflictMetadata -} -export type TopologyGetRoutesResponse = { - timestamp?: string - routingTables?: TopologyRoutingTable[] -} -export type TopologyAddRoutingTableResponse = { - timestamp?: string -} -export type TopologyAddRoutingTableRequest = { - timestamp?: string - routingTable?: TopologyRoutingTable -} -export type TopologyDeleteRoutesResponse = { - timestamp?: string -} -export type TopologyNode = { - id?: string - name?: string - metadata?: ConflictMetadata -} -export type GosdntopologyConfiguration = { - ip?: string - prefixLength?: string -} -export type TopologyPort = { - id?: string - name?: string - configuration?: GosdntopologyConfiguration - metadata?: ConflictMetadata -} -export type TopologyLink = { - id?: string - name?: string - sourceNode?: TopologyNode - targetNode?: TopologyNode - sourcePort?: TopologyPort - targetPort?: TopologyPort - metadata?: ConflictMetadata -} -export type TopologyTopology = { - links?: TopologyLink[] -} -export type TopologyGetTopologyResponse = { - timestamp?: string - toplogy?: TopologyTopology -} -export type TopologyAddLinkResponse = { - timestamp?: string -} -export type TopologyAddLinkRequest = { - timestamp?: string - link?: TopologyLink -} -export type TopologyDeleteLinkResponse = { - timestamp?: string -} -export type TopologyUpdateLinkResponse = { - timestamp?: string -} -export type TopologyUpdateLinkRequest = { - timestamp?: string - link?: TopologyLink -} -export type RbacUser = { - id?: string - name?: string - roles?: { - [key: string]: string - } - password?: string - token?: string - metadata?: ConflictMetadata -} -export type RbacGetUsersResponse = { - timestamp?: string - user?: RbacUser[] -} -export type RbacCreateUsersResponse = { - timestamp?: string -} -export type CreateUsers = { - timestamp?: string - user?: RbacUser[] -} -export type RbacDeleteUsersResponse = { - timestamp?: string -} -export type RbacGetUserResponse = { - timestamp?: string - user?: RbacUser -} -export type RbacUpdateUsersResponse = { - timestamp?: string -} -export type RbacUpdateUser = { - id?: string - name?: string - roles?: { - [key: string]: string - } - password?: string - token?: string - metadata?: ConflictMetadata -} -export type UpdateUsers = { - timestamp?: string - user?: RbacUpdateUser[] -} -export const { - useAppServiceDeregisterMutation, - useConfigurationManagementServiceExportSdnConfigQuery, - useConfigurationManagementServiceImportSdnConfigMutation, - useAuthServiceLoginMutation, - useAuthServiceLogoutMutation, - useNetworkElementServiceUpdateMutation, - usePndServiceGetPndQuery, - usePndServiceGetPndListQuery, - usePndServiceCreatePndListMutation, - usePndServiceDeletePndMutation, - useNetworkElementServiceGetChangeListQuery, - useNetworkElementServiceSetChangeListMutation, - useNetworkElementServiceGetChangeQuery, - useNetworkElementServiceGetQuery, - useNetworkElementServiceGetAllFlattenedQuery, - useNetworkElementServiceAddListMutation, - useNetworkElementServiceSetPathListMutation, - useNetworkElementServiceDeleteMutation, - useNetworkElementServiceGetIntendedPathQuery, - useNetworkElementServiceGetPathQuery, - useAppServiceRegisterMutation, - useRoleServiceGetRolesQuery, - useRoleServiceCreateRolesMutation, - useRoleServiceDeleteRolesMutation, - useRoleServiceDeletePermissionsForRoleMutation, - useRoleServiceGetRoleQuery, - useRoleServiceUpdateRolesMutation, - useRoutingTableServiceGetRoutesQuery, - useRoutingTableServiceAddRoutingTableMutation, - useRoutingTableServiceDeleteRouteMutation, - useTopologyServiceGetTopologyQuery, - useTopologyServiceAddLinkMutation, - useTopologyServiceDeleteLinkMutation, - useTopologyServiceUpdateLinkMutation, - useUserServiceGetUsersQuery, - useUserServiceCreateUsersMutation, - useUserServiceDeleteUsersMutation, - useUserServiceGetUserQuery, - useUserServiceUpdateUsersMutation, -} = injectedRtkApi diff --git a/react-ui/src/components/view/login/login.tsx b/react-ui/src/components/view/login/login.tsx index d86ed0819..919aa4401 100644 --- a/react-ui/src/components/view/login/login.tsx +++ b/react-ui/src/components/view/login/login.tsx @@ -8,32 +8,21 @@ import useLoginViewModel from '@viewmodel/login.viewmodel' const LoginPage = () => { const { t } = useTranslation('common') - const { checked, valid, login } = useLoginViewModel(); + const { valid, login, handleErrorMessageRendering } = useLoginViewModel(); + const usernameRef = useRef<HTMLInputElement>(null) const passwordRef = useRef<HTMLInputElement>(null) const triggerLogin = (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault(); - const username = usernameRef.current?.value; - const password = passwordRef.current?.value; - - if (!username || !password) { - return; - } + const username = usernameRef.current!.value; + const password = passwordRef.current!.value; login(username, password); } - const handleErrorMessageRendering = () => { - if (!checked || valid) { - return; - } - - return ( - <div className="danger-box">{t('login.form.failed')}</div> - ) - } + const invalidCredentials = (<div className="danger-box">{t('login.form.failed')}</div>) return ( <Container className="vh-100 d-flex flex-column justify-content-center login-container"> @@ -44,9 +33,9 @@ const LoginPage = () => { <Col md={6} sm={10} className="c-box p-4"> <h1 className="text-center h2">goSDN - Web</h1> - {handleErrorMessageRendering()} + {handleErrorMessageRendering(invalidCredentials)} - <Form className="mt-4" noValidate validated={checked} onSubmit={triggerLogin}> + <Form className="mt-4" noValidate validated={valid} onSubmit={triggerLogin}> <Form.Group className="mb-3" controlId="loginForm.username" @@ -56,6 +45,7 @@ const LoginPage = () => { type="text" ref={usernameRef} required + autoComplete='on' /> <Form.Control.Feedback type="invalid"> {t('global.form.empty_field')} diff --git a/react-ui/src/components/view_model/login.viewmodel.ts b/react-ui/src/components/view_model/login.viewmodel.ts index d69fa98d6..341c9933f 100644 --- a/react-ui/src/components/view_model/login.viewmodel.ts +++ b/react-ui/src/components/view_model/login.viewmodel.ts @@ -1,10 +1,11 @@ -import { AuthServiceLoginApiArg, useAuthServiceLoginMutation } from "@api/api"; -import { setLoginFormValidity } from "@reducer/login.reducer"; +import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; +import { LoginFormFields, setLoginFormFields, test } from '@reducer/login.reducer'; +import { setToken } from "@reducer/user.reducer"; import { useDispatch, useSelector } from "react-redux"; import { AppDispatch, RootState } from "src/stores"; export default function useLoginViewModel() { - const {valid, checked} = useSelector((state: RootState) => state.loginPageReducer); + const { form, backendResponse } = useSelector((state: RootState) => state.loginPageReducer); const dispatch = useDispatch<AppDispatch>(); const [ @@ -12,8 +13,12 @@ export default function useLoginViewModel() { ] = useAuthServiceLoginMutation() - const isInputValid = (username: string | undefined, password: string | undefined): boolean => { - return !!username && !!password; + const handleErrorMessageRendering = (renderError: JSX.Element): JSX.Element | null => { + if (form.valid && !backendResponse.valid) { + return renderError; + } + + return null; } /** @@ -22,10 +27,10 @@ export default function useLoginViewModel() { const getAuthPayload = (username: string, password: string): AuthServiceLoginApiArg => { const payload: AuthServiceLoginApiArg = { rbacLoginRequest: { - username: username, + username, pwd: password, timestamp: new Date().getTime().toString(), - } + }, } return payload; @@ -37,22 +42,37 @@ export default function useLoginViewModel() { * @description The fields are getting validated against null values * @param event Submit event */ - const login = (username: string, password: string) => { - const inputInvalid = !isInputValid(username, password); - dispatch(setLoginFormValidity(inputInvalid)) - if (inputInvalid) { - return; + const loginHandler = (username: string | undefined, password: string | undefined) => { + const loginFormFields: LoginFormFields = { + username: username, + password: password } + + dispatch(setLoginFormFields(loginFormFields)); + + // don´t execute it here, execute it by subscribing to the store + //executeLogin(username!, password!); + } - const authPayload = getAuthPayload(username!, password!); - sendLogin(authPayload).unwrap() - .then((payload) => console.log('fulfilled', payload)) - .catch((error) => console.error('rejected', error)); + const executeLogin = (username: string, password: string) => { + const authPayload = getAuthPayload(username, password); + + sendLogin(authPayload).unwrap().then((response: AuthServiceLoginApiResponse) => { + if (!response.token) { + // reset the action by calling the reset hook + throw Error("Response is successful but no token was provided. Expected response {token: '<jwt-token>'}"); + } + + dispatch(setToken(response.token)); + }).catch((error) => { + // determine whether 500 or 401 err + }); } + return { - login, - valid, - checked + login: loginHandler, + valid: backendResponse.valid, + handleErrorMessageRendering } } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 0bd142250..89858eea3 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -15,7 +15,9 @@ import './i18n/config' import { I18nextProvider } from 'react-i18next' import i18next from 'i18next' import { Provider } from 'react-redux' -import { store } from './stores' +import { persistor, store } from './stores' +import { ToastContainer } from 'react-toastify' +import { PersistGate } from 'redux-persist/integration/react' const root = ReactDOM.createRoot(document.getElementById('root') as Container) @@ -31,12 +33,21 @@ const router = createBrowserRouter( ) ) +const installToastify = () => { + return ( + <ToastContainer /> + ) +} + root.render( <React.StrictMode> <Provider store={store}> - <I18nextProvider i18n={i18next}> - <RouterProvider router={router} /> - </I18nextProvider> + <PersistGate loading={null} persistor={persistor}> + <I18nextProvider i18n={i18next}> + {installToastify()} + <RouterProvider router={router} /> + </I18nextProvider> + </PersistGate> </Provider> </React.StrictMode> ) diff --git a/react-ui/src/router.tsx b/react-ui/src/router.tsx deleted file mode 100644 index b67113bd7..000000000 --- a/react-ui/src/router.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import { - BrowserRouter as Router, - Route, - Link, - useLocation, - Routes -} from "react-router-dom"; - -// This example has 3 pages: a public page, a protected -// page, and a login screen. In order to see the protected -// page, you must first login. Pretty standard stuff. -// -// First, visit the public page. Then, visit the protected -// page. You're not yet logged in, so you are redirected -// to the login page. After you login, you are redirected -// back to the protected page. -// -// Notice the URL change each time. If you click the back -// button at this point, would you expect to go back to the -// login page? No! You're already logged in. Try it out, -// and you'll see you go back to the page you visited -// just *before* logging in, the public page. - -export default function AuthExample() { - return ( - <ProvideAuth> - <Router> - <div> - <AuthButton /> - - <ul> - <li> - <Link to="/public">Public Page</Link> - </li> - <li> - <Link to="/protected">Protected Page</Link> - </li> - </ul> - - <Routes> - <Route path="/public"> - <PublicPage /> - </Route> - <Route path="/login"> - <LoginPage /> - </Route> - <PrivateRoute path="/protected"> - <ProtectedPage /> - </PrivateRoute> - </Routes> - </div> - </Router> - </ProvideAuth> - ); -} - -/** For more details on - * `authContext`, `ProvideAuth`, `useAuth` and `useProvideAuth` - * refer to: https://usehooks.com/useAuth/ - */ -const authContext = createContext(); - -function ProvideAuth({ children }) { - const auth = useProvideAuth(); - return ( - <authContext.Provider value={auth}> - {children} - </authContext.Provider> - ); -} - -function useAuth() { - return useContext(authContext); -} - -function useProvideAuth() { - const [user, setUser] = useState(null); - - const signin = cb => { - return fakeAuth.signin(() => { - setUser("user"); - cb(); - }); - }; - - const signout = cb => { - return fakeAuth.signout(() => { - setUser(null); - cb(); - }); - }; - - return { - user, - signin, - signout - }; -} - -function AuthButton() { - let history = useHistory(); - let auth = useAuth(); - - return auth.user ? ( - <p> - Welcome!{" "} - <button - onClick={() => { - auth.signout(() => history.push("/")); - }} - > - Sign out - </button> - </p> - ) : ( - <p>You are not logged in.</p> - ); -} - -// A wrapper for <Route> that redirects to the login -// screen if you're not yet authenticated. -function PrivateRoute({ children, ...rest }) { - let auth = useAuth(); - return ( - <Route - {...rest} - render={({ location }) => - auth.user ? ( - children - ) : ( - <Redirect - to={{ - pathname: "/login", - state: { from: location } - }} - /> - ) - } - /> - ); -} - -function PublicPage() { - return <h3>Public</h3>; -} - -function ProtectedPage() { - return <h3>Protected</h3>; -} - -function LoginPage() { - let history = useHistory(); - let location = useLocation(); - let auth = useAuth(); - - let { from } = location.state || { from: { pathname: "/" } }; - let login = () => { - auth.signin(() => { - history.replace(from); - }); - }; - - return ( - <div> - <p>You must log in to view the page at {from.pathname}</p> - <button onClick={login}>Log in</button> - </div> - ); -} \ No newline at end of file diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index 5f9077aee..a63a9d772 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -1,7 +1,18 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' +import { RootState } from '.' // initialize an empty api service that we'll inject endpoints into later as needed export const emptySplitApi = createApi({ - baseQuery: fetchBaseQuery({ baseUrl: '/api' }), + baseQuery: fetchBaseQuery({ + baseUrl: '/api', prepareHeaders: (headers, { getState }) => { + const token = (getState() as RootState).userReducer.token + + if (token) { + headers.set('authorization', `Bearer ${token}`) + } + + return headers + }, + }), endpoints: () => ({}), }) \ No newline at end of file diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index 26d3cde46..ae1890f35 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,24 +1,27 @@ -import { combineReducers } from 'redux' -import loginPageReducer from './reducer/login.reducer' import { configureStore } from '@reduxjs/toolkit' -import { emptySplitApi } from './api.store' import { setupListeners } from '@reduxjs/toolkit/query' - -const getReducers = () => { - return combineReducers({ - loginPageReducer, - [emptySplitApi.reducerPath]: emptySplitApi.reducer - }) -} +import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' +import persistStore from 'redux-persist/es/persistStore' +import { emptySplitApi } from './api.store' +import { rtkQueryErrorLogger } from './middleware/devLogging.middleware' +import persistedReducer from './persist.store' -export const store = configureStore({ - reducer: getReducers(), - middleware: (getDefaultMiddleware) => - getDefaultMiddleware().concat(emptySplitApi.middleware), +export const store = configureStore({ + reducer: persistedReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], + }, + }).concat(emptySplitApi.middleware, rtkQueryErrorLogger), }) +export const persistor = persistStore(store) + +// TODO setupListeners(store.dispatch) export type RootState = ReturnType<typeof store.getState>; +export type MyState = ReturnType<typeof persistedReducer>; export type AppDispatch = typeof store.dispatch; \ No newline at end of file diff --git a/react-ui/src/stores/middleware/devLogging.middleware.ts b/react-ui/src/stores/middleware/devLogging.middleware.ts new file mode 100644 index 000000000..2e58a2ea5 --- /dev/null +++ b/react-ui/src/stores/middleware/devLogging.middleware.ts @@ -0,0 +1,24 @@ +import { isRejectedWithValue } from "@reduxjs/toolkit" +import { toast } from "react-toastify" +import { Middleware, MiddlewareAPI } from "redux" + +const environment = process.env.NODE_ENV || 'prod'; + +// TODO check env before creation of this middleware + +/** + * Log a warning and show a toast! + */ +export const rtkQueryErrorLogger: Middleware = (api: MiddlewareAPI) => (next) => (action) => { + // RTK Query uses `createAsyncThunk` from redux-toolkit under the hood, so we're able to utilize these matchers! + if (environment !== 'prod' && isRejectedWithValue(action)) { + console.warn(action.error) + toast.warn('data' in action.error + ? (action.error.data as { message: string }).message + : action.error.message, { + + }) + } + + return next(action) +} \ No newline at end of file diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts new file mode 100644 index 000000000..53e17bffd --- /dev/null +++ b/react-ui/src/stores/persist.store.ts @@ -0,0 +1,25 @@ +import loginReducer from "@reducer/login.reducer"; +import userReducer from "@reducer/user.reducer"; +import { combineReducers } from "redux"; +import { persistReducer } from "redux-persist"; +import storage from "redux-persist/es/storage"; +import { emptySplitApi } from "./api.store"; + + +/** local storage config */ +const rootPersistConfig = { + key: 'root', + storage, + blacklist: [emptySplitApi.reducerPath], +} + + +const rootReducer = combineReducers({ + userReducer: userReducer, + loginPageReducer: loginReducer, + [emptySplitApi.reducerPath]: emptySplitApi.reducer, +}) + +const persistedReducer = persistReducer(rootPersistConfig, rootReducer) + +export default persistedReducer; \ No newline at end of file diff --git a/react-ui/src/stores/reducer/login.reducer.ts b/react-ui/src/stores/reducer/login.reducer.ts index ec41bd1a3..f0e35cdb1 100644 --- a/react-ui/src/stores/reducer/login.reducer.ts +++ b/react-ui/src/stores/reducer/login.reducer.ts @@ -1,26 +1,52 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -export interface PageLoginState { - valid: boolean, - checked: boolean +export interface LoginFormFields { + username?: string, + password?: string } +export interface PageLoginState { + form: { + valid: boolean, + fields: LoginFormFields + }, + backendResponse: { + valid: boolean, + send: boolean + } +} const initialState: PageLoginState = { - valid: false, - checked: false, + backendResponse: { + valid: false, + send: false + }, + form: { + valid: false, + fields: { + username: '', + password: '' + } + } } - const loginSlice = createSlice({ name: 'page_login', initialState, reducers: { - setLoginFormValidity: (state, action: PayloadAction<boolean>) => - {state.valid = action.payload, state.checked = true}, + setLoginBackendCheck: (state, action: PayloadAction<boolean>) => { state.backendResponse.send = action.payload }, + setLoginFormFields: (state, action: PayloadAction<LoginFormFields>) => { + const valid = !!action.payload.username && !!action.payload.password; + state.form.valid = valid; + + if (valid) { + state.form.fields = action.payload + } + }, }, }) -export const { setLoginFormValidity } = loginSlice.actions +export const { setLoginBackendCheck } = loginSlice.actions +export const { setLoginFormFields } = loginSlice.actions export default loginSlice.reducer diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/stores/reducer/user.reducer.ts new file mode 100644 index 000000000..ef540c334 --- /dev/null +++ b/react-ui/src/stores/reducer/user.reducer.ts @@ -0,0 +1,24 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; + +export interface UserSliceState { + token: string, +} + + +const initialState: UserSliceState = { + token: '' +} + + +const userSlice = createSlice({ + name: 'user', + initialState, + reducers: { + setToken: (state, action: PayloadAction<string>) => { state.token = action.payload }, + }, +}) + +export const { setToken } = userSlice.actions + +export default userSlice.reducer +export const userReducerPath = userSlice.reducerPath; \ No newline at end of file diff --git a/react-ui/src/style/index.scss b/react-ui/src/style/index.scss index 47dd70b60..e210c8415 100644 --- a/react-ui/src/style/index.scss +++ b/react-ui/src/style/index.scss @@ -2,3 +2,4 @@ @import './colors.scss'; @import './utils.scss'; @import './box.scss'; +@import './toast.scss'; diff --git a/react-ui/src/style/toast.scss b/react-ui/src/style/toast.scss new file mode 100644 index 000000000..6b6ba4d67 --- /dev/null +++ b/react-ui/src/style/toast.scss @@ -0,0 +1 @@ +@import 'react-toastify/dist/ReactToastify.css'; \ No newline at end of file diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 914516cda..e2d8790dc 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -3922,6 +3922,11 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clsx@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -8941,6 +8946,13 @@ react-scripts@5.0.1: optionalDependencies: fsevents "^2.3.2" +react-toastify@^10.0.5: + version "10.0.5" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-10.0.5.tgz#6b8f8386060c5c856239f3036d1e76874ce3bd1e" + integrity sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw== + dependencies: + clsx "^2.1.0" + react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" @@ -9009,6 +9021,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-persist@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8" + integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ== + redux-thunk@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" -- GitLab From 5af970109b47eea79447ecf77f4e15134a45de54 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 6 Aug 2024 14:44:00 +0200 Subject: [PATCH 12/78] minor update dependencies --- react-ui/package.json | 1 + react-ui/yarn.lock | 2916 +++++++++++++++++++---------------------- 2 files changed, 1362 insertions(+), 1555 deletions(-) diff --git a/react-ui/package.json b/react-ui/package.json index 0484b6822..4338429b3 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -18,6 +18,7 @@ "react-scripts": "5.0.1", "react-toastify": "^10.0.5", "redux": "^5.0.1", + "redux-observable": "^3.0.0-rc.2", "redux-persist": "^6.0.0", "web-vitals": "^2.1.4" }, diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index e2d8790dc..5bfb5210f 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -3,9 +3,9 @@ "@adobe/css-tools@^4.0.1": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" - integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -61,68 +61,34 @@ ajv-draft-04 "^1.0.0" call-me-maybe "^1.0.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.8.3": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== - dependencies: - "@babel/highlight" "^7.24.2" - picocolors "^1.0.0" - -"@babel/code-frame@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" - integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.8.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.24.6" + "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== - -"@babel/compat-data@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.6.tgz#b3600217688cabb26e25f8e467019e66d71b7ae2" - integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== - -"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" + integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== -"@babel/core@^7.24.5": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787" - integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.24.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.6" - "@babel/generator" "^7.24.6" - "@babel/helper-compilation-targets" "^7.24.6" - "@babel/helper-module-transforms" "^7.24.6" - "@babel/helpers" "^7.24.6" - "@babel/parser" "^7.24.6" - "@babel/template" "^7.24.6" - "@babel/traverse" "^7.24.6" - "@babel/types" "^7.24.6" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -130,95 +96,73 @@ semver "^6.3.1" "@babel/eslint-parser@^7.16.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" - integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" + integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== - dependencies: - "@babel/types" "^7.24.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/generator@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.6.tgz#dfac82a228582a9d30c959fe50ad28951d4737a7" - integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== +"@babel/generator@^7.25.0", "@babel/generator@^7.7.2": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" + integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== dependencies: - "@babel/types" "^7.24.6" + "@babel/types" "^7.25.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz#4a51d681f7680043d38e212715e2a7b1ad29cb51" - integrity sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.24.6" - "@babel/helper-validator-option" "^7.24.6" - browserslist "^4.22.2" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" - integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.24.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz#a109bf9c3d58dfed83aaf42e85633c89f43a6253" + integrity sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/traverse" "^7.25.0" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": +"@babel/helper-define-polyfill-provider@^0.6.2": version "0.6.2" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== @@ -229,276 +173,165 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-environment-visitor@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz#ac7ad5517821641550f6698dd5468f8cef78620d" - integrity sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-function-name@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz#cebdd063386fdb95d511d84b117e51fc68fec0c8" - integrity sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w== - dependencies: - "@babel/template" "^7.24.6" - "@babel/types" "^7.24.6" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz#8a7ece8c26756826b6ffcdd0e3cf65de275af7f9" - integrity sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA== - dependencies: - "@babel/types" "^7.24.6" - -"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" - integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" - -"@babel/helper-module-imports@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz#65e54ffceed6a268dc4ce11f0433b82cfff57852" - integrity sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g== - dependencies: - "@babel/types" "^7.24.6" - -"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-module-transforms@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz#22346ed9df44ce84dee850d7433c5b73fab1fe4e" - integrity sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA== - dependencies: - "@babel/helper-environment-visitor" "^7.24.6" - "@babel/helper-module-imports" "^7.24.6" - "@babel/helper-simple-access" "^7.24.6" - "@babel/helper-split-export-declaration" "^7.24.6" - "@babel/helper-validator-identifier" "^7.24.6" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - 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.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-plugin-utils@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz#fa02a32410a15a6e8f8185bcbf608f10528d2a24" - integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== - -"@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" - integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-simple-access@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz#1d6e04d468bba4fc963b4906f6dac6286cfedff1" - integrity sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g== - dependencies: - "@babel/types" "^7.24.6" - -"@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.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-split-export-declaration@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz#e830068f7ba8861c53b7421c284da30ae656d7a3" - integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== - dependencies: - "@babel/types" "^7.24.6" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-string-parser@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" - integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== - -"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-identifier@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" - integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helper-validator-option@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz#59d8e81c40b7d9109ab7e74457393442177f460a" - integrity sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ== - -"@babel/helper-wrap-function@^7.22.20": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" - integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== - dependencies: - "@babel/helper-function-name" "^7.23.0" - "@babel/template" "^7.24.0" - "@babel/types" "^7.24.5" - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/helpers@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.6.tgz#cd124245299e494bd4e00edda0e4ea3545c2c176" - integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== - dependencies: - "@babel/template" "^7.24.6" - "@babel/types" "^7.24.6" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@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.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" + +"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== + dependencies: + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/helpers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" + integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/highlight@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" - integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" + integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== dependencies: - "@babel/helper-validator-identifier" "^7.24.6" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + "@babel/types" "^7.25.2" -"@babel/parser@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" - integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.3" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" - integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.0" "@babel/plugin-proposal-class-properties@^7.16.0": version "7.18.6" @@ -509,13 +342,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" - integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz#7e2dcfeda4a42596b57c4c9de1f5176bbfc532e3" + integrity sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-decorators" "^7.24.1" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-decorators" "^7.24.7" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" @@ -583,12 +416,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" - integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== +"@babel/plugin-syntax-decorators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz#e4f8a0a8778ccec669611cd5aed1ed8e6e3a6fcf" + integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -604,26 +437,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz#875c25e3428d7896c87589765fc8b9d32f24bd8d" - integrity sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA== +"@babel/plugin-syntax-flow@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7" + integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -639,12 +472,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== +"@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -702,12 +535,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== +"@babel/plugin-syntax-typescript@^7.24.7", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -717,498 +550,506 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== +"@babel/plugin-transform-async-generator-functions@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf" + integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.0" -"@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" - integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: - "@babel/helper-module-imports" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" - integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" + integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" - integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/plugin-transform-classes@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz#63122366527d88e0ef61b612554fe3f8c793991e" + integrity sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.0" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" - integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" + +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/template" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-destructuring@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" - integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" - integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc" - integrity sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ== + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz#b3aa251db44959b7a7c82abcd6b4225dec7d2258" + integrity sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-flow" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-flow" "^7.24.7" -"@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-function-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" - integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== +"@babel/plugin-transform-function-name@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.1" -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" - integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== +"@babel/plugin-transform-literals@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== +"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== +"@babel/plugin-transform-modules-systemjs@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-transforms" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.0" -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" - integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" - integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" - integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" - integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-methods@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" - integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" + integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-property-in-object@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" - integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.5" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz#d493a0918b9fdad7540f5afd9b5eb5c52500d18d" - integrity sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA== + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz#71a665ed16ce618067d05f4a98130207349d82ae" + integrity sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" - integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== +"@babel/plugin-transform-react-jsx-development@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.24.7" "@babel/plugin-transform-react-jsx-self@^7.24.5": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.6.tgz#4fa4870d594d6840d724d2006d0f98b19be6f502" - integrity sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== dependencies: - "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-jsx-source@^7.24.1": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.6.tgz#4e1503f24ca5fccb1fc7f20c57426899d5ce5c1f" - integrity sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== +"@babel/plugin-transform-react-jsx@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" + integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.25.2" -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" - integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== +"@babel/plugin-transform-react-pure-annotations@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-runtime@^7.16.4": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" - integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" + integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== dependencies: - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.1" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" - integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" - integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" - integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" - integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" - integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-typescript@^7.24.1": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz#bcba979e462120dc06a75bd34c473a04781931b8" - integrity sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw== +"@babel/plugin-transform-typescript@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" + integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.5" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/plugin-syntax-typescript" "^7.24.1" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-typescript" "^7.24.7" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" - integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" + integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" - integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== - dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c" + integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" "@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.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" "@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" @@ -1220,59 +1061,60 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.5" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.5" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.5" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.5" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.5" - "@babel/plugin-transform-parameters" "^7.24.5" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.5" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.5" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.0" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.25.0" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.25.0" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.25.1" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.25.2" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + "@babel/plugin-transform-modules-systemjs" "^7.25.0" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" + core-js-compat "^3.37.1" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1285,113 +1127,69 @@ esutils "^2.0.2" "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-react-display-name" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx-development" "^7.24.7" + "@babel/plugin-transform-react-pure-annotations" "^7.24.7" "@babel/preset-typescript@^7.16.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" - integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" + integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-syntax-jsx" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-typescript" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-typescript" "^7.24.7" "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.23.9": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.6.tgz#5b76eb89ad45e2e4a0a8db54c456251469a3358e" - integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/template@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.6.tgz#048c347b2787a6072b24c723664c8d02b67a44f9" - integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw== - dependencies: - "@babel/code-frame" "^7.24.6" - "@babel/parser" "^7.24.6" - "@babel/types" "^7.24.6" - -"@babel/traverse@^7.24.5", "@babel/traverse@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" +"@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.7.2": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" + integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/parser" "^7.25.3" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.2" debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.6.tgz#0941ec50cdeaeacad0911eb67ae227a4f8424edc" - integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw== - dependencies: - "@babel/code-frame" "^7.24.6" - "@babel/generator" "^7.24.6" - "@babel/helper-environment-visitor" "^7.24.6" - "@babel/helper-function-name" "^7.24.6" - "@babel/helper-hoist-variables" "^7.24.6" - "@babel/helper-split-export-declaration" "^7.24.6" - "@babel/parser" "^7.24.6" - "@babel/types" "^7.24.6" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== - dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" - integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" + integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== dependencies: - "@babel/helper-string-parser" "^7.24.6" - "@babel/helper-validator-identifier" "^7.24.6" + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1510,120 +1308,120 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== - -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== - -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== - -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== - -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== - -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== - -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== - -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== - -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== - -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== - -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== - -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== - -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== - -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== - -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== - -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== - -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== - -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== - -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== - -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== - -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== - -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== - -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -1633,9 +1431,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1973,9 +1771,9 @@ "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" @@ -2029,16 +1827,16 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.13" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz#02338a92a92f541a5189b97e922caf3215221e49" - integrity sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g== + version "0.5.15" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz#f126be97c30b83ed777e2aeabd518bc592e6e7c4" + integrity sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ== dependencies: - ansi-html-community "^0.0.8" + ansi-html "^0.0.9" core-js-pure "^3.23.3" error-stack-parser "^2.0.6" html-entities "^2.1.0" loader-utils "^2.0.4" - schema-utils "^3.0.0" + schema-utils "^4.2.0" source-map "^0.7.3" "@popperjs/core@^2.11.6": @@ -2047,26 +1845,26 @@ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@react-aria/ssr@^3.5.0": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.4.tgz#9da8b10342c156e816dbfa4c9e713b21f274d7ab" - integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ== + version "3.9.5" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.5.tgz#775d84f51f90934ff51ae74eeba3728daac1a381" + integrity sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ== dependencies: "@swc/helpers" "^0.5.0" "@reduxjs/toolkit@^2.2.4": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.5.tgz#c0d2d8482ef80722bebe015ff05b06c34bfb6e0d" - integrity sha512-aeFA/s5NCG7NoJe/MhmwREJxRkDs0ZaSqt0MxhWUrwCf1UQXpwR87RROJEql0uAkLI6U7snBOYOcKw83ew3FPg== + version "2.2.7" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.7.tgz#199e3d10ccb39267cb5aee92c0262fd9da7fdfb2" + integrity sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g== dependencies: immer "^10.0.3" redux "^5.0.1" redux-thunk "^3.1.0" reselect "^5.1.0" -"@remix-run/router@1.16.1": - version "1.16.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" - integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== +"@remix-run/router@1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.0.tgz#745dbffbce67f05386d57ca22c51dfd85c979593" + integrity sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA== "@restart/hooks@^0.4.9": version "0.4.16" @@ -2075,10 +1873,10 @@ dependencies: dequal "^2.0.3" -"@restart/ui@^1.6.8": - version "1.6.9" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.9.tgz#05ec905a56486fa39b62f29c09b3917e57acd62f" - integrity sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw== +"@restart/ui@^1.6.9": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.8.0.tgz#3e8d80822b5fbef0576f94acda51d7da9e79e005" + integrity sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g== dependencies: "@babel/runtime" "^7.21.0" "@popperjs/core" "^2.11.6" @@ -2127,85 +1925,85 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/rollup-android-arm-eabi@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" - integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== - -"@rollup/rollup-android-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" - integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== - -"@rollup/rollup-darwin-arm64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" - integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== - -"@rollup/rollup-darwin-x64@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" - integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" - integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== - -"@rollup/rollup-linux-arm-musleabihf@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" - integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== - -"@rollup/rollup-linux-arm64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" - integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== - -"@rollup/rollup-linux-arm64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" - integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" - integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== - -"@rollup/rollup-linux-riscv64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" - integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== - -"@rollup/rollup-linux-s390x-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" - integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== - -"@rollup/rollup-linux-x64-gnu@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" - integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== - -"@rollup/rollup-linux-x64-musl@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" - integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== - -"@rollup/rollup-win32-arm64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" - integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== - -"@rollup/rollup-win32-ia32-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" - integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== - -"@rollup/rollup-win32-x64-msvc@4.18.0": - version "4.18.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" - integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== +"@rollup/rollup-android-arm-eabi@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz#c3f5660f67030c493a981ac1d34ee9dfe1d8ec0f" + integrity sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA== + +"@rollup/rollup-android-arm64@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz#64161f0b67050023a3859e723570af54a82cff5c" + integrity sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ== + +"@rollup/rollup-darwin-arm64@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz#25f3d57b1da433097cfebc89341b355901615763" + integrity sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q== + +"@rollup/rollup-darwin-x64@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz#d8ddaffb636cc2f59222c50316e27771e48966df" + integrity sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz#41bd4fcffa20fb84f3dbac6c5071638f46151885" + integrity sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA== + +"@rollup/rollup-linux-arm-musleabihf@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz#842077c5113a747eb5686f19f2f18c33ecc0acc8" + integrity sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw== + +"@rollup/rollup-linux-arm64-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz#65d1d5b6778848f55b7823958044bf3e8737e5b7" + integrity sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ== + +"@rollup/rollup-linux-arm64-musl@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz#50eef7d6e24d0fe3332200bb666cad2be8afcf86" + integrity sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q== + +"@rollup/rollup-linux-powerpc64le-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz#8837e858f53c84607f05ad0602943e96d104c6b4" + integrity sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw== + +"@rollup/rollup-linux-riscv64-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz#c894ade2300caa447757ddf45787cca246e816a4" + integrity sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA== + +"@rollup/rollup-linux-s390x-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz#5841e5390d4c82dd5cdf7b2c95a830e3c2f47dd3" + integrity sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg== + +"@rollup/rollup-linux-x64-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz#cc1f26398bf777807a99226dc13f47eb0f6c720d" + integrity sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew== + +"@rollup/rollup-linux-x64-musl@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz#1507465d9056e0502a590d4c1a00b4d7b1fda370" + integrity sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg== + +"@rollup/rollup-win32-arm64-msvc@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz#86a221f01a2c248104dd0defb4da119f2a73642e" + integrity sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA== + +"@rollup/rollup-win32-ia32-msvc@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz#8bc8f77e02760aa664694b4286d6fbea7f1331c5" + integrity sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A== + +"@rollup/rollup-win32-x64-msvc@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz#601fffee719a1e8447f908aca97864eec23b2784" + integrity sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg== "@rtk-query/codegen-openapi@^1.2.0": version "1.2.0" @@ -2221,9 +2019,9 @@ typescript "^5.0.0" "@rushstack/eslint-patch@^1.1.0": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" - integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== + version "1.10.4" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" + integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== "@sinclair/typebox@^0.24.1": version "0.24.51" @@ -2363,9 +2161,9 @@ loader-utils "^2.0.0" "@swc/helpers@^0.5.0": - version "0.5.11" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7" - integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A== + version "0.5.12" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" + integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g== dependencies: tslib "^2.4.0" @@ -2500,10 +2298,18 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.56.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" - integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== +"@types/eslint@*": + version "9.6.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.0.tgz#51d4fe4d0316da9e9f2c80884f2c20ed5fb022ff" + integrity sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/eslint@^7.29.0 || ^8.4.1": + version "8.56.11" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.11.tgz#e2ff61510a3b9454b3329fe7731e3b4c6f780041" + integrity sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2519,9 +2325,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.1.tgz#57d34698bb580720fd6e3c360d4b2fdef579b979" - integrity sha512-ej0phymbFLoCB26dbbq5PGScsf2JAJ4IJHjG10LalgUV36XKTmA4GdA+PVllKvRk0sEKt64X8975qFnkSi0hqA== + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2612,11 +2418,11 @@ "@types/node" "*" "@types/node@*": - version "20.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" - integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== + version "22.1.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.1.0.tgz#6d6adc648b5e03f0e83c78dc788c2b037d0ad94b" + integrity sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw== dependencies: - undici-types "~5.26.4" + undici-types "~6.13.0" "@types/parse-json@^4.0.0": version "4.0.2" @@ -2662,15 +2468,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.11": - version "18.3.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" - integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/react@^18.2.66": +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.2.66": version "18.3.3" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== @@ -2754,9 +2552,9 @@ integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== "@types/ws@^8.5.5": - version "8.5.10" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" - integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== dependencies: "@types/node" "*" @@ -2796,15 +2594,15 @@ tsutils "^3.21.0" "@typescript-eslint/eslint-plugin@^7.2.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz#07854a236f107bb45cbf4f62b89474cbea617f50" - integrity sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw== + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.10.0" - "@typescript-eslint/type-utils" "7.10.0" - "@typescript-eslint/utils" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" @@ -2828,14 +2626,14 @@ debug "^4.3.4" "@typescript-eslint/parser@^7.2.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.10.0.tgz#e6ac1cba7bc0400a4459e7eb5b23115bd71accfb" - integrity sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w== - dependencies: - "@typescript-eslint/scope-manager" "7.10.0" - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/typescript-estree" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -2846,13 +2644,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz#054a27b1090199337a39cf755f83d9f2ce26546b" - integrity sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" "@typescript-eslint/type-utils@5.62.0": version "5.62.0" @@ -2864,13 +2662,13 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz#8a75accce851d0a331aa9331268ef64e9b300270" - integrity sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g== +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: - "@typescript-eslint/typescript-estree" "7.10.0" - "@typescript-eslint/utils" "7.10.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -2879,10 +2677,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.10.0.tgz#da92309c97932a3a033762fd5faa8b067de84e3b" - integrity sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -2897,13 +2695,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz#6dcdc5de3149916a6a599fa89dde5c471b88b8bb" - integrity sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/visitor-keys" "7.10.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2925,15 +2723,15 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.10.0.tgz#8ee43e5608c9f439524eaaea8de5b358b15c51b3" - integrity sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg== +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.10.0" - "@typescript-eslint/types" "7.10.0" - "@typescript-eslint/typescript-estree" "7.10.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" @@ -2943,12 +2741,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz#2af2e91e73a75dd6b70b4486c48ae9d38a485a78" - integrity sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg== +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: - "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -2957,9 +2755,9 @@ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== "@vitejs/plugin-react@^4.2.1": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.0.tgz#f20ec2369a92d8abaaefa60da8b7157819d20481" - integrity sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== dependencies: "@babel/core" "^7.24.5" "@babel/plugin-transform-react-jsx-self" "^7.24.5" @@ -3119,10 +2917,10 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.3.2: version "5.3.2" @@ -3140,9 +2938,9 @@ acorn@^7.1.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== address@^1.0.1, address@^1.1.2: version "1.2.2" @@ -3198,23 +2996,13 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== - dependencies: - fast-deep-equal "^3.1.3" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.4.1" - -ajv@^8.6.3: - version "8.15.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.15.0.tgz#d918c661e3e820bbbc65a320e182ee56a1aa978a" - integrity sha512-15BTtQUOsSrmHCy+B4VnAiJAJxJ8IFgu6fcjFQF3jQYZ78nLSQthlFg4ehp+NLIyfvFgOlxNsjKIEhydtFPVHQ== +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.6.3, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" - fast-uri "^2.3.0" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" @@ -3230,6 +3018,11 @@ ansi-html-community@^0.0.8: resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== +ansi-html@^0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.9.tgz#6512d02342ae2cc68131952644a129cb734cd3f0" + integrity sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -3294,14 +3087,14 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.1.3: +aria-query@5.1.3, aria-query@~5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" -aria-query@^5.0.0, aria-query@^5.3.0: +aria-query@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -3321,7 +3114,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.6, array-includes@^3.1.7: +array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -3338,7 +3131,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlast@^1.2.4: +array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== @@ -3395,25 +3188,15 @@ array.prototype.reduce@^1.0.6: es-object-atoms "^1.0.0" is-string "^1.0.7" -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" + es-abstract "^1.23.3" + es-errors "^1.3.0" es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.3: @@ -3456,15 +3239,15 @@ at-least-node@^1.0.0: integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.13: - version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== + version "10.4.20" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" + browserslist "^4.23.3" + caniuse-lite "^1.0.30001646" fraction.js "^4.3.7" normalize-range "^0.1.2" - picocolors "^1.0.0" + picocolors "^1.0.1" postcss-value-parser "^4.2.0" available-typed-arrays@^1.0.7: @@ -3474,17 +3257,17 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.9.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" + integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== +axobject-query@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" @@ -3555,12 +3338,12 @@ babel-plugin-polyfill-corejs2@^0.4.10: semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" - integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - core-js-compat "^3.36.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.2" @@ -3721,15 +3504,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.23.1, browserslist@^4.23.3: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" bser@2.1.1: version "2.1.1" @@ -3812,10 +3595,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001621" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz#4adcb443c8b9c8303e04498318f987616b8fea2e" - integrity sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646: + version "1.0.30001649" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz#3ec700309ca0da2b0d3d5fb03c411b191761c992" + integrity sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -3878,9 +3661,9 @@ check-types@^11.2.3: fsevents "~2.3.2" chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== ci-info@^3.2.0: version "3.9.0" @@ -4089,22 +3872,22 @@ cookie@0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" - integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== +core-js-compat@^3.37.1, core-js-compat@^3.38.0: + version "3.38.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.0.tgz#d93393b1aa346b6ee683377b0c31172ccfe607aa" + integrity sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.3" core-js-pure@^3.23.3: - version "3.37.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.1.tgz#2b4b34281f54db06c9a9a5bd60105046900553bd" - integrity sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA== + version "3.38.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.38.0.tgz#bc802cd152e33d5b0ec733b656c71cb847cac701" + integrity sha512-8balb/HAXo06aHP58mZMtXgD8vcnXz9tUDePgqBgJgKdmTlMt+jw3ujqniuBDQXMvTzxnMpxHFeuSM3g1jWQuQ== core-js@^3.19.2: - version "3.37.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.1.tgz#d21751ddb756518ac5a00e4d66499df981a62db9" - integrity sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw== + version "3.38.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.0.tgz#8acb7c050bf2ccbb35f938c0d040132f6110f636" + integrity sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug== core-util-is@~1.0.0: version "1.0.3" @@ -4391,9 +4174,9 @@ debug@2.6.9, debug@^2.6.0: 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.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -4687,10 +4470,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.668: - version "1.4.779" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.779.tgz#bb6f08b93092a564421adcadcc4b92c5055c7a77" - integrity sha512-oaTiIcszNfySXVJzKcjxd2YjPxziAd+GmXyb2HbidCeFo6Z88ygOT7EimlrEQhM2U08VhSrbKhLOXP0kKUCZ6g== +electron-to-chromium@^1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz#03bfdf422bdd2c05ee2657efedde21264a1a566b" + integrity sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA== emittery@^0.10.2: version "0.10.2" @@ -4722,10 +4505,10 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^5.16.0: - version "5.16.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" - integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== +enhanced-resolve@^5.17.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4749,7 +4532,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -4813,7 +4596,7 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== @@ -4833,7 +4616,7 @@ es-get-iterator@^1.1.3: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: +es-iterator-helpers@^1.0.19: version "1.0.19" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== @@ -4854,9 +4637,9 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.5.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.3.tgz#25969419de9c0b1fbe54279789023e8a9a788412" - integrity sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== es-object-atoms@^1.0.0: version "1.0.0" @@ -4895,34 +4678,34 @@ es6-promise@^3.2.1: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== -esbuild@^0.20.1: - version "0.20.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" @@ -5069,26 +4852,26 @@ eslint-plugin-jest@^25.3.0: "@typescript-eslint/experimental-utils" "^5.0.0" eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + version "6.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" + integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" + aria-query "~5.1.3" + array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" + axe-core "^4.9.1" + axobject-query "~3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" + es-iterator-helpers "^1.0.19" + hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.0" eslint-plugin-prettier@^4.0.0: version "4.2.1" @@ -5103,33 +4886,33 @@ eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react-refresh@^0.4.6: - version "0.4.7" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz#1f597f9093b254f10ee0961c139a749acb19af7d" - integrity sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw== + version "0.4.9" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz#bf870372b353b12e1e6fb7fc41b282d9cbc8d93d" + integrity sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA== eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + version "7.35.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" + integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" + es-iterator-helpers "^1.0.19" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.10" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" eslint-plugin-testing-library@^5.0.1: version "5.11.1" @@ -5239,9 +5022,9 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -5401,10 +5184,10 @@ fast-safe-stringify@^2.0.7: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== -fast-uri@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-2.3.0.tgz#bdae493942483d299e7285dcb4627767d42e2793" - integrity sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== fastq@^1.6.0: version "1.17.1" @@ -5533,9 +5316,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -5622,7 +5405,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: +function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -5702,15 +5485,16 @@ glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^10.3.10: - version "10.3.16" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.16.tgz#bf6679d5d51279c8cfae4febe0d051d2a4bf4c6f" - integrity sha512-JDKXl1DiuuHJ6fVS2FXjownaavciiHNUU4mOvV/B793RLh05vZL1rcPnCSaOgv1hDT6RDlY7AB7ZUvFYAtPgAw== + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.11.0" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" @@ -6009,9 +5793,9 @@ human-signals@^2.1.0: integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== i18next@^23.11.5: - version "23.11.5" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" - integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== + version "23.12.2" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.12.2.tgz#c5b44bb95e4d4a5908a51577fa06c63dc2f650a4" + integrity sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg== dependencies: "@babel/runtime" "^7.23.2" @@ -6062,9 +5846,9 @@ immer@^9.0.7: integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== immutable@^4.0.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" - integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" @@ -6075,9 +5859,9 @@ import-fresh@^3.1.0, import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -6197,11 +5981,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" + integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-view@^1.0.1: version "1.0.1" @@ -6462,18 +6246,18 @@ iterator.prototype@^1.1.2: set-function-name "^2.0.1" jackspeak@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.1.2.tgz#eada67ea949c6b71de50f1b09c92a961897b90ab" - integrity sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ== + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.9.1" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" - integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -7015,9 +6799,9 @@ jest@^27.4.3: jest-cli "^27.5.1" jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -7192,9 +6976,9 @@ language-tags@^1.0.9: language-subtag-registry "^0.3.20" launch-editor@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" - integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + version "2.8.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.1.tgz#3bda72af213ec9b46b170e39661916ec66c2f463" + integrity sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -7226,9 +7010,9 @@ lilconfig@^2.0.3, lilconfig@^2.1.0: integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== lines-and-columns@^1.1.6: version "1.2.4" @@ -7250,9 +7034,9 @@ loader-utils@^2.0.0, loader-utils@^2.0.4: json5 "^2.1.2" loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" + integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== locate-path@^3.0.0: version "3.0.0" @@ -7321,9 +7105,9 @@ lower-case@^2.0.2: tslib "^2.0.3" lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^5.1.1: version "5.1.1" @@ -7415,11 +7199,16 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -7469,10 +7258,10 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1, minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -7481,10 +7270,10 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" - integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mkdirp@~0.5.1: version "0.5.6" @@ -7589,10 +7378,10 @@ node-readfiles@^0.2.0: dependencies: es6-promise "^3.2.1" -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7631,9 +7420,9 @@ nth-check@^2.0.1: boolbase "^1.0.0" nwsapi@^2.2.0: - version "2.2.10" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" - integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== oas-kit-common@^1.0.8: version "1.0.8" @@ -7703,9 +7492,9 @@ object-hash@^3.0.0: integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== object-is@^1.1.5: version "1.1.6" @@ -7730,7 +7519,7 @@ object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.7: +object.entries@^1.1.5, object.entries@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -7739,7 +7528,7 @@ object.entries@^1.1.5, object.entries@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: +object.fromentries@^2.0.7, object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -7771,16 +7560,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.values@^1.1.0, object.values@^1.1.6, object.values@^1.1.7: +object.values@^1.1.0, object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -7901,6 +7681,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -7969,7 +7754,7 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.0: +path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -8336,11 +8121,11 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: - postcss-selector-parser "^6.0.11" + postcss-selector-parser "^6.1.1" postcss-nesting@^10.2.0: version "10.2.0" @@ -8543,10 +8328,10 @@ postcss-selector-not@^6.0.1: dependencies: postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" - integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9, postcss-selector-parser@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz#5be94b277b8955904476a2400260002ce6c56e38" + integrity sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8579,13 +8364,13 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.4: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.39, postcss@^8.4.4: + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" + picocolors "^1.0.1" source-map-js "^1.2.0" prelude-ls@^1.2.1: @@ -8770,13 +8555,13 @@ react-app-polyfill@^3.0.0: whatwg-fetch "^3.6.2" react-bootstrap@^2.10.2: - version "2.10.2" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.2.tgz#3b609eb0170e31b3d9ace297d3a016c202a42642" - integrity sha512-UvB7mRqQjivdZNxJNEA2yOQRB7L9N43nBnKc33K47+cH90/ujmnMwatTCwQLu83gLhrzAl8fsa6Lqig/KLghaA== + version "2.10.4" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.4.tgz#ed92f5f8225a44919a7707829bac879558b71b70" + integrity sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q== dependencies: - "@babel/runtime" "^7.22.5" + "@babel/runtime" "^7.24.7" "@restart/hooks" "^0.4.9" - "@restart/ui" "^1.6.8" + "@restart/ui" "^1.6.9" "@types/react-transition-group" "^4.4.6" classnames "^2.3.2" dom-helpers "^5.2.1" @@ -8831,9 +8616,9 @@ react-error-overlay@^6.0.11: integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== react-i18next@^14.1.2: - version "14.1.2" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.2.tgz#cd57a755f25a32a5fcc3dbe546cf3cc62b4f3ebd" - integrity sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg== + version "14.1.3" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.3.tgz#85525c4294ef870ddd3f5d184e793cae362f47cb" + integrity sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw== dependencies: "@babel/runtime" "^7.23.9" html-parse-stringify "^3.0.1" @@ -8877,19 +8662,19 @@ react-refresh@^0.14.2: integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== react-router-dom@^6.23.1: - version "6.23.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" - integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== + version "6.26.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.0.tgz#8debe13295c58605c04f93018d659a763245e58c" + integrity sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ== dependencies: - "@remix-run/router" "1.16.1" - react-router "6.23.1" + "@remix-run/router" "1.19.0" + react-router "6.26.0" -react-router@6.23.1: - version "6.23.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9" - integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== +react-router@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.0.tgz#d5af4c46835b202348ef2b7ddacd32a2db539fde" + integrity sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg== dependencies: - "@remix-run/router" "1.16.1" + "@remix-run/router" "1.19.0" react-scripts@5.0.1: version "5.0.1" @@ -9021,6 +8806,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-observable@^3.0.0-rc.2: + version "3.0.0-rc.2" + resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-3.0.0-rc.2.tgz#baef603781c5dabd9ddd70526357076cd5c128a2" + integrity sha512-gG/pWIKgSrcTyyavm2so5tc7tuyCQ47p3VdCAG6wt+CV0WGhDr50cMQHLcYKxFZSGgTm19a8ZmyfJGndmGDpYg== + redux-persist@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8" @@ -9149,9 +8939,9 @@ requires-port@^1.0.0: integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== reselect@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" - integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== + version "5.1.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" + integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== resolve-cwd@^3.0.0: version "3.0.0" @@ -9239,28 +9029,28 @@ rollup@^2.43.1: fsevents "~2.3.2" rollup@^4.13.0: - version "4.18.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" - integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + version "4.20.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.20.0.tgz#f9d602161d29e178f0bf1d9f35f0a26f83939492" + integrity sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw== dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" - "@rollup/rollup-darwin-arm64" "4.18.0" - "@rollup/rollup-darwin-x64" "4.18.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" - "@rollup/rollup-linux-arm-musleabihf" "4.18.0" - "@rollup/rollup-linux-arm64-gnu" "4.18.0" - "@rollup/rollup-linux-arm64-musl" "4.18.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" - "@rollup/rollup-linux-riscv64-gnu" "4.18.0" - "@rollup/rollup-linux-s390x-gnu" "4.18.0" - "@rollup/rollup-linux-x64-gnu" "4.18.0" - "@rollup/rollup-linux-x64-musl" "4.18.0" - "@rollup/rollup-win32-arm64-msvc" "4.18.0" - "@rollup/rollup-win32-ia32-msvc" "4.18.0" - "@rollup/rollup-win32-x64-msvc" "4.18.0" + "@rollup/rollup-android-arm-eabi" "4.20.0" + "@rollup/rollup-android-arm64" "4.20.0" + "@rollup/rollup-darwin-arm64" "4.20.0" + "@rollup/rollup-darwin-x64" "4.20.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.20.0" + "@rollup/rollup-linux-arm-musleabihf" "4.20.0" + "@rollup/rollup-linux-arm64-gnu" "4.20.0" + "@rollup/rollup-linux-arm64-musl" "4.20.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.20.0" + "@rollup/rollup-linux-riscv64-gnu" "4.20.0" + "@rollup/rollup-linux-s390x-gnu" "4.20.0" + "@rollup/rollup-linux-x64-gnu" "4.20.0" + "@rollup/rollup-linux-x64-musl" "4.20.0" + "@rollup/rollup-win32-arm64-msvc" "4.20.0" + "@rollup/rollup-win32-ia32-msvc" "4.20.0" + "@rollup/rollup-win32-x64-msvc" "4.20.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -9318,9 +9108,9 @@ sass-loader@^12.3.0: neo-async "^2.6.2" sass@^1.77.2: - version "1.77.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa" - integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA== + version "1.77.8" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.8.tgz#9f18b449ea401759ef7ec1752a16373e296b52bd" + integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9372,7 +9162,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: +schema-utils@^4.0.0, schema-utils@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== @@ -9401,9 +9191,9 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== send@0.18.0: version "0.18.0" @@ -9755,7 +9545,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== @@ -9773,6 +9571,14 @@ string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: set-function-name "^2.0.2" side-channel "^1.0.6" +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" @@ -9990,9 +9796,9 @@ symbol-tree@^3.2.4: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tailwindcss@^3.0.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" - integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== + version "3.4.7" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.7.tgz#6092f18767f5933f59375b9afe558e592fc77201" + integrity sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" @@ -10062,9 +9868,9 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.31.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" - integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== + version "5.31.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.3.tgz#b24b7beb46062f4653f049eea4f0cd165d0f0c38" + integrity sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10191,9 +9997,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3, tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tsutils@^3.21.0: version "3.21.0" @@ -10296,9 +10102,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@^5.0.0, typescript@^5.2.2: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== unbox-primitive@^1.0.2: version "1.0.2" @@ -10330,10 +10136,10 @@ underscore@1.12.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.13.0.tgz#e3e79220ab8c81ed1496b5812471afd7cf075ea5" + integrity sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -10390,15 +10196,15 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.13: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" picocolors "^1.0.1" -uri-js@^4.2.2, uri-js@^4.4.1: +uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -10463,12 +10269,12 @@ vary@~1.1.2: integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vite@^5.2.0: - version "5.2.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" - integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== + version "5.3.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" + integrity sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA== dependencies: - esbuild "^0.20.1" - postcss "^8.4.38" + esbuild "^0.21.3" + postcss "^8.4.39" rollup "^4.13.0" optionalDependencies: fsevents "~2.3.3" @@ -10623,9 +10429,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.91.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + version "5.93.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5" + integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" @@ -10633,10 +10439,10 @@ webpack@^5.64.4: "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" + acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.0" + enhanced-resolve "^5.17.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -10721,12 +10527,12 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" is-async-function "^2.0.0" is-date-object "^1.0.5" is-finalizationregistry "^1.0.2" @@ -10735,10 +10541,10 @@ which-builtin-type@^1.1.3: is-weakref "^1.0.2" isarray "^2.0.5" which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" + which-collection "^1.0.2" + which-typed-array "^1.1.15" -which-collection@^1.0.1: +which-collection@^1.0.1, which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -10748,7 +10554,7 @@ which-collection@^1.0.1: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -10981,14 +10787,14 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.13.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xml-name-validator@^3.0.0: version "3.0.0" @@ -11016,9 +10822,9 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.3.4: - version "2.4.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" - integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" + integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== yargs-parser@^20.2.2: version "20.2.9" -- GitLab From ef7e7ef659ce8c95f39ef0ce3ed08f45bea23aa4 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 6 Aug 2024 14:58:41 +0200 Subject: [PATCH 13/78] update major versions --- react-ui/package.json | 26 +- react-ui/yarn.lock | 549 +++++++++++++++++++++--------------------- 2 files changed, 294 insertions(+), 281 deletions(-) diff --git a/react-ui/package.json b/react-ui/package.json index 4338429b3..c178d3acb 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -4,15 +4,15 @@ "private": true, "dependencies": { "@reduxjs/toolkit": "^2.2.4", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", + "@testing-library/jest-dom": "^6.4.8", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", "bootstrap": "^5.3.3", "i18next": "^23.11.5", "react": "^18.3.1", "react-bootstrap": "^2.10.2", "react-dom": "^18.3.1", - "react-i18next": "^14.1.2", + "react-i18next": "^15.0.0", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", "react-scripts": "5.0.1", @@ -20,7 +20,7 @@ "redux": "^5.0.1", "redux-observable": "^3.0.0-rc.2", "redux-persist": "^6.0.0", - "web-vitals": "^2.1.4" + "web-vitals": "^4.2.2" }, "scripts": { "start": "vite", @@ -55,20 +55,20 @@ "@rtk-query/codegen-openapi": "^1.2.0", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-config-airbnb-typescript": "^16.1.0", - "eslint-config-prettier": "^8.0.0", + "eslint": "^9.8.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "prettier": "^2.0.0", - "sass": "^1.77.2", + "prettier": "^3.3.3", + "sass": "1.77.6", "typescript": "^5.2.2", "vite": "^5.2.0" } diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 5bfb5210f..b08ab4c98 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@adobe/css-tools@^4.0.1": +"@adobe/css-tools@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== @@ -1154,7 +1154,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== @@ -1430,11 +1430,20 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.11.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint/config-array@^0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910" + integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -1450,11 +1459,36 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.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" + "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.8.0": + version "9.8.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.8.0.tgz#ae9bc14bb839713c5056f5018bcefa955556d3a4" + integrity sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + "@exodus/schemasafe@^1.0.0-rc.2": version "1.3.0" resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" @@ -1479,6 +1513,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1575,13 +1614,6 @@ "@types/node" "*" jest-mock "^27.5.1" -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - "@jest/fake-timers@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" @@ -1641,13 +1673,6 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - "@jest/source-map@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" @@ -1731,18 +1756,6 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" @@ -1826,6 +1839,11 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.15" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz#f126be97c30b83ed777e2aeabd518bc592e6e7c4" @@ -2028,11 +2046,6 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -2167,50 +2180,31 @@ dependencies: tslib "^2.4.0" -"@testing-library/dom@^8.5.0": - version "8.20.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" - integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.1.3" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.5.0" - pretty-format "^27.0.2" - -"@testing-library/jest-dom@^5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" - integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== +"@testing-library/jest-dom@^6.4.8": + version "6.4.8" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz#9c435742b20c6183d4e7034f2b329d562c079daa" + integrity sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw== dependencies: - "@adobe/css-tools" "^4.0.1" + "@adobe/css-tools" "^4.4.0" "@babel/runtime" "^7.9.2" - "@types/testing-library__jest-dom" "^5.9.1" aria-query "^5.0.0" chalk "^3.0.0" css.escape "^1.5.1" - dom-accessibility-api "^0.5.6" - lodash "^4.17.15" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" redent "^3.0.0" -"@testing-library/react@^13.4.0": - version "13.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" - integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== +"@testing-library/react@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.0.tgz#0a1e0c7a3de25841c3591b8cb7fb0cf0c0a27321" + integrity sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ== dependencies: "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.5.0" - "@types/react-dom" "^18.0.0" -"@testing-library/user-event@^13.5.0": - version "13.5.0" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" - integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== - dependencies: - "@babel/runtime" "^7.12.5" +"@testing-library/user-event@^14.5.2": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== "@tootallnate/once@1": version "1.1.2" @@ -2222,11 +2216,6 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@types/aria-query@^5.0.1": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" - integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== - "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -2387,14 +2376,6 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*": - version "29.5.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" - integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -2454,7 +2435,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.22": +"@types/react-dom@^18.2.22": version "18.3.0" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== @@ -2529,13 +2510,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/testing-library__jest-dom@^5.9.1": - version "5.14.9" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" - integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== - dependencies: - "@types/jest" "*" - "@types/trusted-types@^2.0.2": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" @@ -2593,16 +2567,16 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/eslint-plugin@^7.2.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" - integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== +"@typescript-eslint/eslint-plugin@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz#5dbd1b498fdea83a16d292322d27d293ce156f94" + integrity sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/type-utils" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager" "8.0.1" + "@typescript-eslint/type-utils" "8.0.1" + "@typescript-eslint/utils" "8.0.1" + "@typescript-eslint/visitor-keys" "8.0.1" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" @@ -2625,15 +2599,15 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/parser@^7.2.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" - integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== +"@typescript-eslint/parser@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.0.1.tgz#eb0728147a3a79edf43dde84c797f117213bbfdb" + integrity sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg== dependencies: - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager" "8.0.1" + "@typescript-eslint/types" "8.0.1" + "@typescript-eslint/typescript-estree" "8.0.1" + "@typescript-eslint/visitor-keys" "8.0.1" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -2644,13 +2618,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" - integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== +"@typescript-eslint/scope-manager@8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz#544259c29e1ebf65d30b6e99a9f420d98795a54e" + integrity sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ== dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/types" "8.0.1" + "@typescript-eslint/visitor-keys" "8.0.1" "@typescript-eslint/type-utils@5.62.0": version "5.62.0" @@ -2662,13 +2636,13 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" - integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== +"@typescript-eslint/type-utils@8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz#a613ee2dfeed4a9781300b5d326ec7cf946eed92" + integrity sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng== dependencies: - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/typescript-estree" "8.0.1" + "@typescript-eslint/utils" "8.0.1" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -2677,10 +2651,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" - integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== +"@typescript-eslint/types@8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.0.1.tgz#333e2f4c158952dbc8181a4ddcc6e49898a28918" + integrity sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -2695,13 +2669,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== +"@typescript-eslint/typescript-estree@8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz#64575ec7b77aedfe497acdfb2779ec942bb8d866" + integrity sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w== dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/types" "8.0.1" + "@typescript-eslint/visitor-keys" "8.0.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2723,15 +2697,15 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" - integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== +"@typescript-eslint/utils@8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.0.1.tgz#b48e3320c4f9011f97d25e0588b8c143adc38d2a" + integrity sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/scope-manager" "8.0.1" + "@typescript-eslint/types" "8.0.1" + "@typescript-eslint/typescript-estree" "8.0.1" "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" @@ -2741,12 +2715,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== +"@typescript-eslint/visitor-keys@8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz#e5816803b4dad1de5e97f00df8dc15d0bcb49778" + integrity sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ== dependencies: - "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/types" "8.0.1" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -2937,7 +2911,7 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.12.0, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -3087,13 +3061,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.1.3, aria-query@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - aria-query@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" @@ -3101,6 +3068,13 @@ aria-query@^5.0.0: dependencies: dequal "^2.0.3" +aria-query@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -4314,11 +4288,6 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4352,10 +4321,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: - version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" - integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== dom-converter@^0.2.0: version "0.2.0" @@ -4765,17 +4734,17 @@ eslint-config-airbnb-base@^15.0.0: object.entries "^1.1.5" semver "^6.3.0" -eslint-config-airbnb-typescript@^16.1.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.2.0.tgz#9193fafd62f1cbf444895f4495eae334baf3265b" - integrity sha512-OUaMPZpTOZGKd5tXOjJ9PRU4iYNW/Z5DoHIynjsVK/FpkWdiY5+nxQW6TiJAlLwVI1l53xUOrnlZWtVBVQzuWA== +eslint-config-airbnb-typescript@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz#b1646db4134858d704b1d2bee47e1d72c180315f" + integrity sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg== dependencies: eslint-config-airbnb-base "^15.0.0" -eslint-config-prettier@^8.0.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-config-react-app@^7.0.1: version "7.0.1" @@ -4873,12 +4842,13 @@ eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.0" -eslint-plugin-prettier@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== +eslint-plugin-prettier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" + integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== dependencies: prettier-linter-helpers "^1.0.0" + synckit "^0.9.1" eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: version "4.6.2" @@ -4937,6 +4907,14 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" + integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -4947,6 +4925,11 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + eslint-webpack-plugin@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" @@ -4958,7 +4941,7 @@ eslint-webpack-plugin@^3.1.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.3.0, eslint@^8.57.0: +eslint@^8.3.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -5002,6 +4985,55 @@ eslint@^8.3.0, eslint@^8.57.0: strip-ansi "^6.0.1" text-table "^0.2.0" +eslint@^9.8.0: + version "9.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.8.0.tgz#a4f4a090c8ea2d10864d89a6603e02ce9f649f0f" + integrity sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.17.1" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.8.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + 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.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^10.0.1, espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -5021,7 +5053,7 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.4.2, esquery@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== @@ -5100,17 +5132,6 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" -expect@^29.0.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - express@^4.17.3: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" @@ -5217,6 +5238,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -5298,6 +5326,14 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flatted@^3.2.9: version "3.3.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" @@ -5536,6 +5572,11 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + globalthis@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -6356,16 +6397,6 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - jest-docblock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" @@ -6414,11 +6445,6 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - jest-haste-map@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" @@ -6480,16 +6506,6 @@ jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - jest-message-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" @@ -6520,21 +6536,6 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" @@ -6698,18 +6699,6 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - jest-validate@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" @@ -6941,7 +6930,7 @@ jsonpointer@^5.0.0: object.assign "^4.1.4" object.values "^1.1.6" -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -7085,7 +7074,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7116,11 +7105,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lz-string@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" - integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== - magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -8390,11 +8374,16 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.0, prettier@^2.2.1: +prettier@^2.2.1: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -8408,7 +8397,7 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@^27.0.2, pretty-format@^27.5.1: +pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -8427,15 +8416,6 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -8615,12 +8595,12 @@ react-error-overlay@^6.0.11: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== -react-i18next@^14.1.2: - version "14.1.3" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.3.tgz#85525c4294ef870ddd3f5d184e793cae362f47cb" - integrity sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw== +react-i18next@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.0.0.tgz#4980f8edf85b9df6573d6b12d95aca5b8f0cc8b0" + integrity sha512-2O3IgF4zivg57Q6p6i+ChDgJ371IDcEWbuWC6gvoh5NbkDMs0Q+O7RPr4v61+Se32E0V+LmtwePAeqWZW0bi6g== dependencies: - "@babel/runtime" "^7.23.9" + "@babel/runtime" "^7.24.8" html-parse-stringify "^3.0.1" react-is@^16.13.1, react-is@^16.3.2: @@ -9107,10 +9087,10 @@ sass-loader@^12.3.0: klona "^2.0.4" neo-async "^2.6.2" -sass@^1.77.2: - version "1.77.8" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.8.tgz#9f18b449ea401759ef7ec1752a16373e296b52bd" - integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ== +sass@1.77.6: + version "1.77.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" + integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -9527,7 +9507,16 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9630,7 +9619,14 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9795,6 +9791,14 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +synckit@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" + integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + tailwindcss@^3.0.2: version "3.4.7" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.7.tgz#6092f18767f5933f59375b9afe558e592fc77201" @@ -9996,7 +10000,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.4.0: +tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== @@ -10327,10 +10331,10 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -web-vitals@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" - integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== +web-vitals@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.2.tgz#e883245180b95e175eb75a5ca8903b1a11597d7a" + integrity sha512-nYfoOqb4EmElljyXU2qdeE76KsvoHdftQKY4DzA9Aw8DervCg2bG634pHLrJ/d6+B4mE3nWTSJv8Mo7B2mbZkw== webidl-conversions@^3.0.0: version "3.0.1" @@ -10753,7 +10757,16 @@ workbox-window@6.6.1: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + 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.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== -- GitLab From 1adeca621c101530fcbd700a16480dd6f5688aec Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 6 Aug 2024 16:57:38 +0200 Subject: [PATCH 14/78] add redux listener --- react-ui/src/hooks.ts | 5 +++++ react-ui/src/stores/index.ts | 3 ++- .../src/stores/middleware/listener.middleware.ts | 5 +++++ react-ui/src/stores/reducer/login.reducer.ts | 12 ++++++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 react-ui/src/hooks.ts create mode 100644 react-ui/src/stores/middleware/listener.middleware.ts diff --git a/react-ui/src/hooks.ts b/react-ui/src/hooks.ts new file mode 100644 index 000000000..aa20e122d --- /dev/null +++ b/react-ui/src/hooks.ts @@ -0,0 +1,5 @@ +import { useDispatch, useSelector } from "react-redux" +import { AppDispatch, RootState } from "./stores" + +export const useAppDispatch = useDispatch.withTypes<AppDispatch>() +export const useAppSelector = useSelector.withTypes<RootState>() \ No newline at end of file diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index ae1890f35..e00e33f48 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -5,6 +5,7 @@ import persistStore from 'redux-persist/es/persistStore' import { emptySplitApi } from './api.store' import { rtkQueryErrorLogger } from './middleware/devLogging.middleware' import persistedReducer from './persist.store' +import { listenerMiddleware } from './middleware/listener.middleware' export const store = configureStore({ @@ -14,7 +15,7 @@ export const store = configureStore({ serializableCheck: { ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], }, - }).concat(emptySplitApi.middleware, rtkQueryErrorLogger), + }).prepend(listenerMiddleware.middleware).concat(emptySplitApi.middleware, rtkQueryErrorLogger), }) export const persistor = persistStore(store) diff --git a/react-ui/src/stores/middleware/listener.middleware.ts b/react-ui/src/stores/middleware/listener.middleware.ts new file mode 100644 index 000000000..3802e575c --- /dev/null +++ b/react-ui/src/stores/middleware/listener.middleware.ts @@ -0,0 +1,5 @@ +import { createListenerMiddleware } from "@reduxjs/toolkit"; + +export const listenerMiddleware = createListenerMiddleware() + +export const { startListening, stopListening } = listenerMiddleware \ No newline at end of file diff --git a/react-ui/src/stores/reducer/login.reducer.ts b/react-ui/src/stores/reducer/login.reducer.ts index f0e35cdb1..aba386576 100644 --- a/react-ui/src/stores/reducer/login.reducer.ts +++ b/react-ui/src/stores/reducer/login.reducer.ts @@ -1,4 +1,6 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { startListening } from '../middleware/listener.middleware'; +import { useAuthServiceLoginMutation } from '@api/api'; export interface LoginFormFields { username?: string, @@ -50,3 +52,13 @@ export const { setLoginBackendCheck } = loginSlice.actions export const { setLoginFormFields } = loginSlice.actions export default loginSlice.reducer + + +startListening({ + actionCreator: setLoginFormFields, + + effect: async (action, listenerApi) => { + console.log('oh baby'); + + }, +}) \ No newline at end of file -- GitLab From f016d917ae4e5f6480066128e8924d4214f2f764 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 19 Aug 2024 00:59:12 +0200 Subject: [PATCH 15/78] finished visualization of login page --- react-ui/docs/README.md | 21 + react-ui/package.json | 4 + react-ui/scripts/openapi-config.json | 3 +- react-ui/src/components/view/login/login.tsx | 20 +- .../components/view_model/login.viewmodel.ts | 62 +- .../src/i18n/locales/en/translations.json | 1 + react-ui/src/index.tsx | 4 +- react-ui/src/stores/reducer/login.reducer.ts | 53 +- react-ui/src/stores/reducer/user.reducer.ts | 5 +- react-ui/src/style/box.scss | 16 +- react-ui/src/style/colors.scss | 1 + react-ui/src/utils/api/api.ts | 1283 +++++++++++++++++ react-ui/src/utils/icons/icons.ts | 4 + react-ui/tsconfig.json | 2 +- react-ui/vite.config.mjs | 2 +- react-ui/yarn.lock | 33 + 16 files changed, 1448 insertions(+), 66 deletions(-) create mode 100644 react-ui/docs/README.md create mode 100644 react-ui/src/utils/api/api.ts create mode 100644 react-ui/src/utils/icons/icons.ts diff --git a/react-ui/docs/README.md b/react-ui/docs/README.md new file mode 100644 index 000000000..df992548a --- /dev/null +++ b/react-ui/docs/README.md @@ -0,0 +1,21 @@ +# goSDN - react ui +The goSDN project is currently managed by a cli. With increased complexity it's getting harder and harder to manage, observe and debug this networks. This subproject provides an UI that keep large projects handable + + +## Getting started +Install all dependencies +``` +yarn install +yarn build::api +``` + +Run the local development server +``` +yarn start +``` +The ui is now accessible by `localhost:3000` + + + +## Development notes +The ui can run independently from goSDN. But to actually get in touch with the ui, log in and start working with it you need a running goSDN instance on your local maschine. \ No newline at end of file diff --git a/react-ui/package.json b/react-ui/package.json index c178d3acb..f1941701c 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -3,6 +3,10 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.6.0", + "@fortawesome/free-regular-svg-icons": "^6.6.0", + "@fortawesome/free-solid-svg-icons": "^6.6.0", + "@fortawesome/react-fontawesome": "^0.2.2", "@reduxjs/toolkit": "^2.2.4", "@testing-library/jest-dom": "^6.4.8", "@testing-library/react": "^16.0.0", diff --git a/react-ui/scripts/openapi-config.json b/react-ui/scripts/openapi-config.json index f4246e548..dbb9a84af 100644 --- a/react-ui/scripts/openapi-config.json +++ b/react-ui/scripts/openapi-config.json @@ -6,5 +6,6 @@ "exportName": "api", "hooks": true, "nullSafeAdditionalProps": true, - "withInterfaces": true + "withInterfaces": true, + "tag": true } \ No newline at end of file diff --git a/react-ui/src/components/view/login/login.tsx b/react-ui/src/components/view/login/login.tsx index 919aa4401..fe3b6369c 100644 --- a/react-ui/src/components/view/login/login.tsx +++ b/react-ui/src/components/view/login/login.tsx @@ -1,14 +1,14 @@ -import { Button, Col, Container, Form, Image, Row } from 'react-bootstrap' +import { Alert, Button, Col, Container, Form, Image, Row, Spinner } from 'react-bootstrap' import { useTranslation } from 'react-i18next' import './login.scss' import logo from '@assets/logo.svg' -import React, { useRef } from 'react' import useLoginViewModel from '@viewmodel/login.viewmodel' +import React, { useRef } from 'react' const LoginPage = () => { const { t } = useTranslation('common') - const { valid, login, handleErrorMessageRendering } = useLoginViewModel(); + const { login, handleErrorMessageRendering, displayFormFieldChecks, loginLoading } = useLoginViewModel(); const usernameRef = useRef<HTMLInputElement>(null) @@ -22,7 +22,9 @@ const LoginPage = () => { login(username, password); } - const invalidCredentials = (<div className="danger-box">{t('login.form.failed')}</div>) + const invalidForm = (<Alert variant="warning">{t('login.form.invalid')}</Alert>) + const invalidCredentials = (<Alert variant="danger">{t('login.form.failed')}</Alert>) + return ( <Container className="vh-100 d-flex flex-column justify-content-center login-container"> @@ -33,9 +35,9 @@ const LoginPage = () => { <Col md={6} sm={10} className="c-box p-4"> <h1 className="text-center h2">goSDN - Web</h1> - {handleErrorMessageRendering(invalidCredentials)} + {handleErrorMessageRendering(invalidForm, invalidCredentials)} - <Form className="mt-4" noValidate validated={valid} onSubmit={triggerLogin}> + <Form className="mt-4" noValidate validated={displayFormFieldChecks()} onSubmit={triggerLogin}> <Form.Group className="mb-3" controlId="loginForm.username" @@ -65,8 +67,14 @@ const LoginPage = () => { variant="primary" type="submit" className="w-100 mt-3" + disabled={loginLoading} > {t('global.form.submit')} + {loginLoading && + <Spinner animation="border" size="sm" role="status"> + <span className="visually-hidden">Loading...</span> + </Spinner> + } </Button> </Form> </Col> diff --git a/react-ui/src/components/view_model/login.viewmodel.ts b/react-ui/src/components/view_model/login.viewmodel.ts index 341c9933f..110507a65 100644 --- a/react-ui/src/components/view_model/login.viewmodel.ts +++ b/react-ui/src/components/view_model/login.viewmodel.ts @@ -1,21 +1,43 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; -import { LoginFormFields, setLoginFormFields, test } from '@reducer/login.reducer'; import { setToken } from "@reducer/user.reducer"; -import { useDispatch, useSelector } from "react-redux"; -import { AppDispatch, RootState } from "src/stores"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useDispatch } from "react-redux"; +import { AppDispatch } from "src/stores"; + +export interface PageLoginState { + submitted: boolean, + valid: boolean, +} export default function useLoginViewModel() { - const { form, backendResponse } = useSelector((state: RootState) => state.loginPageReducer); const dispatch = useDispatch<AppDispatch>(); const [ sendLogin, + { data: loginResponse, error: loginError, isLoading: loginLoading, reset: resetLogin } ] = useAuthServiceLoginMutation() - const handleErrorMessageRendering = (renderError: JSX.Element): JSX.Element | null => { - if (form.valid && !backendResponse.valid) { - return renderError; + const [localFormState, updateLocalFormState] = useState({ + submitted: false, + valid: false, + }); + + + useEffect(() => { + console.log('loginREsponse:' + loginResponse); + }, [loginResponse]) + + const handleErrorMessageRendering = (formInvalidError: JSX.Element, backendResponseError: JSX.Element): JSX.Element | null => { + // backend response check + console.log('loginError:' + loginError); + if (!!loginError) { + return backendResponseError; + } + + // form invalid check + if (localFormState.submitted && !localFormState.valid) { + return formInvalidError; } return null; @@ -36,6 +58,10 @@ export default function useLoginViewModel() { return payload; } + const isFormValid = (username: string | undefined, password: string | undefined): boolean => { + return !!username && !!password; + } + /** * Tries to `/login` by using the input fields. * @@ -43,15 +69,14 @@ export default function useLoginViewModel() { * @param event Submit event */ const loginHandler = (username: string | undefined, password: string | undefined) => { - const loginFormFields: LoginFormFields = { - username: username, - password: password - } + resetLogin(); + const valid = isFormValid(username, password); - dispatch(setLoginFormFields(loginFormFields)); + updateLocalFormState({ ...localFormState, valid, submitted: true }) - // don´t execute it here, execute it by subscribing to the store - //executeLogin(username!, password!); + if (valid) { + executeLogin(username!, password!); + } } const executeLogin = (username: string, password: string) => { @@ -69,10 +94,15 @@ export default function useLoginViewModel() { }); } + const displayFormFieldChecks = (): boolean => { + return localFormState.submitted && !loginError; + } + return { + displayFormFieldChecks, login: loginHandler, - valid: backendResponse.valid, - handleErrorMessageRendering + handleErrorMessageRendering: handleErrorMessageRendering, + loginLoading, } } diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index d03dd572d..12ffef164 100644 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -9,6 +9,7 @@ "login": { "form": { "failed": "The username or password is invalid", + "invalid": "Please type a username and password", "username": { "label": "Username" }, diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 89858eea3..8441405d0 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,3 +1,4 @@ +import './index.scss' import React from 'react' import ReactDOM, { Container } from 'react-dom/client' import { @@ -7,7 +8,6 @@ import { createBrowserRouter, createRoutesFromElements, } from 'react-router-dom' -import './index.scss' import Landingpage from './components/view/landingpage/landingpage' import LoginPage from './components/view/login/login' @@ -18,6 +18,8 @@ import { Provider } from 'react-redux' import { persistor, store } from './stores' import { ToastContainer } from 'react-toastify' import { PersistGate } from 'redux-persist/integration/react' +import './utils/icons/icons'; + const root = ReactDOM.createRoot(document.getElementById('root') as Container) diff --git a/react-ui/src/stores/reducer/login.reducer.ts b/react-ui/src/stores/reducer/login.reducer.ts index aba386576..7016aa723 100644 --- a/react-ui/src/stores/reducer/login.reducer.ts +++ b/react-ui/src/stores/reducer/login.reducer.ts @@ -1,24 +1,8 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; import { startListening } from '../middleware/listener.middleware'; -import { useAuthServiceLoginMutation } from '@api/api'; +import { AuthServiceLoginApiArg, RbacUser, api, useAuthServiceLoginMutation } from '@api/api'; -export interface LoginFormFields { - username?: string, - password?: string -} - -export interface PageLoginState { - form: { - valid: boolean, - fields: LoginFormFields - }, - backendResponse: { - valid: boolean, - send: boolean - } -} - -const initialState: PageLoginState = { +const initialState = { backendResponse: { valid: false, send: false @@ -37,28 +21,29 @@ const loginSlice = createSlice({ initialState, reducers: { setLoginBackendCheck: (state, action: PayloadAction<boolean>) => { state.backendResponse.send = action.payload }, - setLoginFormFields: (state, action: PayloadAction<LoginFormFields>) => { - const valid = !!action.payload.username && !!action.payload.password; - state.form.valid = valid; - if (valid) { - state.form.fields = action.payload - } - }, + loginSuccess: (state, action: PayloadAction<string>) => { + state.backendResponse.valid = true; + } }, }) export const { setLoginBackendCheck } = loginSlice.actions -export const { setLoginFormFields } = loginSlice.actions export default loginSlice.reducer -startListening({ - actionCreator: setLoginFormFields, - - effect: async (action, listenerApi) => { - console.log('oh baby'); - - }, -}) \ No newline at end of file +// startListening({ +// actionCreator: setLoginFormFields, + +// effect: async (action, listenerApi) => { +// const payload: AuthServiceLoginApiArg = { +// rbacLoginRequest: { +// username: action.payload.username, +// pwd: action.payload.password, +// timestamp: new Date().getTime().toString(), +// }, +// } +// listenerApi.dispatch(api.endpoints.authServiceLogin.initiate(payload)); +// }, +// }) \ No newline at end of file diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/stores/reducer/user.reducer.ts index ef540c334..d1a3c99ca 100644 --- a/react-ui/src/stores/reducer/user.reducer.ts +++ b/react-ui/src/stores/reducer/user.reducer.ts @@ -1,12 +1,15 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { RbacUser } from '../../utils/api/api'; export interface UserSliceState { token: string, + user: RbacUser | null, } const initialState: UserSliceState = { - token: '' + token: '', + user: null } diff --git a/react-ui/src/style/box.scss b/react-ui/src/style/box.scss index e705404c9..e7a3ca7d3 100644 --- a/react-ui/src/style/box.scss +++ b/react-ui/src/style/box.scss @@ -11,10 +11,16 @@ $border-radius: 10px; border-radius: $border-radius; } -.danger-box { - background-color: map-get($theme-colors, 'danger') !important; - border-radius: calc($border-radius / 2); - +.abstract-box { padding: 16px $box-padding; font-size: .90em; -} \ No newline at end of file + border-radius: calc($border-radius / 2); +} + + +// @each $color, $value in $theme-colors { +// .#{$color}-box { +// @extend .abstract-box; +// background-color: $value !important; +// } +// } diff --git a/react-ui/src/style/colors.scss b/react-ui/src/style/colors.scss index 1f11a48f3..a10e9eafe 100644 --- a/react-ui/src/style/colors.scss +++ b/react-ui/src/style/colors.scss @@ -2,6 +2,7 @@ $theme-colors: ( 'primary': #b350e0, 'bg-primary': #E1E1E1, 'danger': #ffdcdc, + 'warning': #dbd116, ); @import '/node_modules/bootstrap/scss/bootstrap'; diff --git a/react-ui/src/utils/api/api.ts b/react-ui/src/utils/api/api.ts new file mode 100644 index 000000000..a5d1ebd6b --- /dev/null +++ b/react-ui/src/utils/api/api.ts @@ -0,0 +1,1283 @@ +import { emptySplitApi as api } from '../../stores/api.store' +export const addTagTypes = [ + 'AppService', + 'ConfigurationManagementService', + 'AuthService', + 'NetworkElementService', + 'PndService', + 'RoleService', + 'RoutingTableService', + 'TopologyService', + 'UserService', +] as const +const injectedRtkApi = api + .enhanceEndpoints({ + addTagTypes, + }) + .injectEndpoints({ + endpoints: (build) => ({ + appServiceDeregister: build.mutation< + AppServiceDeregisterApiResponse, + AppServiceDeregisterApiArg + >({ + query: (queryArg) => ({ + url: `/deregister`, + method: 'POST', + body: queryArg.appAppDeregisterRequest, + }), + invalidatesTags: ['AppService'], + }), + configurationManagementServiceExportSdnConfig: build.query< + ConfigurationManagementServiceExportSdnConfigApiResponse, + ConfigurationManagementServiceExportSdnConfigApiArg + >({ + query: (queryArg) => ({ + url: `/export/${queryArg.pid}`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['ConfigurationManagementService'], + }), + configurationManagementServiceImportSdnConfig: build.mutation< + ConfigurationManagementServiceImportSdnConfigApiResponse, + ConfigurationManagementServiceImportSdnConfigApiArg + >({ + query: (queryArg) => ({ + url: `/import/${queryArg.pid}`, + method: 'POST', + params: { + timestamp: queryArg.timestamp, + sdnConfigData: queryArg.sdnConfigData, + }, + }), + invalidatesTags: ['ConfigurationManagementService'], + }), + authServiceLogin: build.mutation< + AuthServiceLoginApiResponse, + AuthServiceLoginApiArg + >({ + query: (queryArg) => ({ + url: `/login`, + method: 'POST', + body: queryArg.rbacLoginRequest, + }), + invalidatesTags: ['AuthService'], + }), + authServiceLogout: build.mutation< + AuthServiceLogoutApiResponse, + AuthServiceLogoutApiArg + >({ + query: (queryArg) => ({ + url: `/logout/${queryArg.username}`, + method: 'POST', + params: { timestamp: queryArg.timestamp }, + }), + invalidatesTags: ['AuthService'], + }), + networkElementServiceGetAllFlattened: build.query< + NetworkElementServiceGetAllFlattenedApiResponse, + NetworkElementServiceGetAllFlattenedApiArg + >({ + query: (queryArg) => ({ + url: `/mnes`, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, + }), + providesTags: ['NetworkElementService'], + }), + networkElementServiceAddList: build.mutation< + NetworkElementServiceAddListApiResponse, + NetworkElementServiceAddListApiArg + >({ + query: (queryArg) => ({ + url: `/mnes`, + method: 'POST', + body: queryArg.networkelementAddListRequest, + }), + invalidatesTags: ['NetworkElementService'], + }), + networkElementServiceGetChangeList: build.query< + NetworkElementServiceGetChangeListApiResponse, + NetworkElementServiceGetChangeListApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/changes`, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, + }), + providesTags: ['NetworkElementService'], + }), + networkElementServiceSetChangeList: build.mutation< + NetworkElementServiceSetChangeListApiResponse, + NetworkElementServiceSetChangeListApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/changes`, + method: 'POST', + body: queryArg.networkelementSetChangeListRequest, + }), + invalidatesTags: ['NetworkElementService'], + }), + networkElementServiceGetChange: build.query< + NetworkElementServiceGetChangeApiResponse, + NetworkElementServiceGetChangeApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/changes/${queryArg.cuid}`, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, + }), + providesTags: ['NetworkElementService'], + }), + networkElementServiceSetPathList: build.mutation< + NetworkElementServiceSetPathListApiResponse, + NetworkElementServiceSetPathListApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/paths`, + method: 'POST', + body: queryArg.networkelementSetPathListRequest, + }), + invalidatesTags: ['NetworkElementService'], + }), + networkElementServiceGet: build.query< + NetworkElementServiceGetApiResponse, + NetworkElementServiceGetApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/${queryArg.mneid}`, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, + }), + providesTags: ['NetworkElementService'], + }), + networkElementServiceDelete: build.mutation< + NetworkElementServiceDeleteApiResponse, + NetworkElementServiceDeleteApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/${queryArg.mneid}`, + method: 'DELETE', + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, + }), + invalidatesTags: ['NetworkElementService'], + }), + networkElementServiceGetIntendedPath: build.query< + NetworkElementServiceGetIntendedPathApiResponse, + NetworkElementServiceGetIntendedPathApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/${queryArg.mneid}/intendedpaths/${queryArg.intendedPath}`, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, + }), + providesTags: ['NetworkElementService'], + }), + networkElementServiceGetPath: build.query< + NetworkElementServiceGetPathApiResponse, + NetworkElementServiceGetPathApiArg + >({ + query: (queryArg) => ({ + url: `/mnes/${queryArg.mneid}/paths/${queryArg.path}`, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, + }), + providesTags: ['NetworkElementService'], + }), + networkElementServiceUpdate: build.mutation< + NetworkElementServiceUpdateApiResponse, + NetworkElementServiceUpdateApiArg + >({ + query: (queryArg) => ({ + url: `/network-element/update`, + method: 'POST', + body: queryArg.networkelementUpdateNetworkElementRequest, + }), + invalidatesTags: ['NetworkElementService'], + }), + pndServiceGetPnd: build.query< + PndServiceGetPndApiResponse, + PndServiceGetPndApiArg + >({ + query: (queryArg) => ({ + url: `/pnd/${queryArg.pid}`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['PndService'], + }), + pndServiceGetPndList: build.query< + PndServiceGetPndListApiResponse, + PndServiceGetPndListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['PndService'], + }), + pndServiceCreatePndList: build.mutation< + PndServiceCreatePndListApiResponse, + PndServiceCreatePndListApiArg + >({ + query: (queryArg) => ({ + url: `/pnds`, + method: 'POST', + body: queryArg.pndCreatePndListRequest, + }), + invalidatesTags: ['PndService'], + }), + pndServiceDeletePnd: build.mutation< + PndServiceDeletePndApiResponse, + PndServiceDeletePndApiArg + >({ + query: (queryArg) => ({ + url: `/pnds/${queryArg.pid}`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp }, + }), + invalidatesTags: ['PndService'], + }), + appServiceRegister: build.mutation< + AppServiceRegisterApiResponse, + AppServiceRegisterApiArg + >({ + query: (queryArg) => ({ + url: `/register`, + method: 'POST', + body: queryArg.appAppRegisterRequest, + }), + invalidatesTags: ['AppService'], + }), + roleServiceGetRoles: build.query< + RoleServiceGetRolesApiResponse, + RoleServiceGetRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['RoleService'], + }), + roleServiceCreateRoles: build.mutation< + RoleServiceCreateRolesApiResponse, + RoleServiceCreateRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles/create`, + method: 'POST', + body: queryArg.rbacCreateRolesRequest, + }), + invalidatesTags: ['RoleService'], + }), + roleServiceDeleteRoles: build.mutation< + RoleServiceDeleteRolesApiResponse, + RoleServiceDeleteRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles/delete`, + method: 'DELETE', + params: { + timestamp: queryArg.timestamp, + roleName: queryArg.roleName, + }, + }), + invalidatesTags: ['RoleService'], + }), + roleServiceDeletePermissionsForRole: build.mutation< + RoleServiceDeletePermissionsForRoleApiResponse, + RoleServiceDeletePermissionsForRoleApiArg + >({ + query: (queryArg) => ({ + url: `/roles/delete/permissions`, + method: 'DELETE', + params: { + timestamp: queryArg.timestamp, + roleName: queryArg.roleName, + permissionsToDelete: queryArg.permissionsToDelete, + }, + }), + invalidatesTags: ['RoleService'], + }), + roleServiceGetRole: build.query< + RoleServiceGetRoleApiResponse, + RoleServiceGetRoleApiArg + >({ + query: (queryArg) => ({ + url: `/roles/get`, + params: { + timestamp: queryArg.timestamp, + roleName: queryArg.roleName, + id: queryArg.id, + }, + }), + providesTags: ['RoleService'], + }), + roleServiceUpdateRoles: build.mutation< + RoleServiceUpdateRolesApiResponse, + RoleServiceUpdateRolesApiArg + >({ + query: (queryArg) => ({ + url: `/roles/update`, + method: 'POST', + body: queryArg.rbacUpdateRolesRequest, + }), + invalidatesTags: ['RoleService'], + }), + routingTableServiceGetRoutes: build.query< + RoutingTableServiceGetRoutesApiResponse, + RoutingTableServiceGetRoutesApiArg + >({ + query: (queryArg) => ({ + url: `/routing`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['RoutingTableService'], + }), + routingTableServiceAddRoutingTable: build.mutation< + RoutingTableServiceAddRoutingTableApiResponse, + RoutingTableServiceAddRoutingTableApiArg + >({ + query: (queryArg) => ({ + url: `/routing/create`, + method: 'POST', + body: queryArg.topologyAddRoutingTableRequest, + }), + invalidatesTags: ['RoutingTableService'], + }), + routingTableServiceDeleteRoute: build.mutation< + RoutingTableServiceDeleteRouteApiResponse, + RoutingTableServiceDeleteRouteApiArg + >({ + query: (queryArg) => ({ + url: `/routing/delete`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp, id: queryArg.id }, + }), + invalidatesTags: ['RoutingTableService'], + }), + topologyServiceGetTopology: build.query< + TopologyServiceGetTopologyApiResponse, + TopologyServiceGetTopologyApiArg + >({ + query: (queryArg) => ({ + url: `/topology`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['TopologyService'], + }), + topologyServiceAddLink: build.mutation< + TopologyServiceAddLinkApiResponse, + TopologyServiceAddLinkApiArg + >({ + query: (queryArg) => ({ + url: `/topology/create`, + method: 'POST', + body: queryArg.topologyAddLinkRequest, + }), + invalidatesTags: ['TopologyService'], + }), + topologyServiceDeleteLink: build.mutation< + TopologyServiceDeleteLinkApiResponse, + TopologyServiceDeleteLinkApiArg + >({ + query: (queryArg) => ({ + url: `/topology/delete`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp, id: queryArg.id }, + }), + invalidatesTags: ['TopologyService'], + }), + topologyServiceUpdateLink: build.mutation< + TopologyServiceUpdateLinkApiResponse, + TopologyServiceUpdateLinkApiArg + >({ + query: (queryArg) => ({ + url: `/topology/update`, + method: 'POST', + body: queryArg.topologyUpdateLinkRequest, + }), + invalidatesTags: ['TopologyService'], + }), + userServiceGetUsers: build.query< + UserServiceGetUsersApiResponse, + UserServiceGetUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['UserService'], + }), + userServiceCreateUsers: build.mutation< + UserServiceCreateUsersApiResponse, + UserServiceCreateUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users/create`, + method: 'POST', + body: queryArg.rbacCreateUsersRequest, + }), + invalidatesTags: ['UserService'], + }), + userServiceDeleteUsers: build.mutation< + UserServiceDeleteUsersApiResponse, + UserServiceDeleteUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users/delete`, + method: 'DELETE', + params: { + timestamp: queryArg.timestamp, + username: queryArg.username, + }, + }), + invalidatesTags: ['UserService'], + }), + userServiceGetUser: build.query< + UserServiceGetUserApiResponse, + UserServiceGetUserApiArg + >({ + query: (queryArg) => ({ + url: `/users/get`, + params: { + timestamp: queryArg.timestamp, + name: queryArg.name, + id: queryArg.id, + }, + }), + providesTags: ['UserService'], + }), + userServiceUpdateUsers: build.mutation< + UserServiceUpdateUsersApiResponse, + UserServiceUpdateUsersApiArg + >({ + query: (queryArg) => ({ + url: `/users/update`, + method: 'POST', + body: queryArg.rbacUpdateUsersRequest, + }), + invalidatesTags: ['UserService'], + }), + }), + overrideExisting: false, + }) +export { injectedRtkApi as api } +export type AppServiceDeregisterApiResponse = + /** status 200 A successful response. */ AppAppDeregisterResponse +export type AppServiceDeregisterApiArg = { + appAppDeregisterRequest: AppAppDeregisterRequest +} +export type ConfigurationManagementServiceExportSdnConfigApiResponse = + /** status 200 A successful response. */ ConfigurationmanagementExportSdnConfigResponse +export type ConfigurationManagementServiceExportSdnConfigApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type ConfigurationManagementServiceImportSdnConfigApiResponse = + /** status 200 A successful response. */ ConfigurationmanagementImportSdnConfigResponse +export type ConfigurationManagementServiceImportSdnConfigApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + sdnConfigData?: string +} +export type AuthServiceLoginApiResponse = + /** status 200 A successful response. */ RbacLoginResponse +export type AuthServiceLoginApiArg = { + rbacLoginRequest: Login +} +export type AuthServiceLogoutApiResponse = + /** status 200 A successful response. */ RbacLogoutResponse +export type AuthServiceLogoutApiArg = { + username: string + timestamp?: string +} +export type NetworkElementServiceGetAllFlattenedApiResponse = + /** status 200 A successful response. */ NetworkelementGetAllFlattenedResponse +export type NetworkElementServiceGetAllFlattenedApiArg = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pid?: string +} +export type NetworkElementServiceAddListApiResponse = + /** status 200 A successful response. */ NetworkelementAddListResponse +export type NetworkElementServiceAddListApiArg = { + networkelementAddListRequest: NetworkelementAddListRequest +} +export type NetworkElementServiceGetChangeListApiResponse = + /** status 200 A successful response. */ NetworkelementGetChangeListResponse +export type NetworkElementServiceGetChangeListApiArg = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pid?: string +} +export type NetworkElementServiceSetChangeListApiResponse = + /** status 200 A successful response. */ NetworkelementSetChangeListResponse +export type NetworkElementServiceSetChangeListApiArg = { + networkelementSetChangeListRequest: NetworkelementSetChangeListRequest +} +export type NetworkElementServiceGetChangeApiResponse = + /** status 200 A successful response. */ NetworkelementGetChangeResponse +export type NetworkElementServiceGetChangeApiArg = { + cuid: string[] + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pid?: string +} +export type NetworkElementServiceSetPathListApiResponse = + /** status 200 A successful response. */ NetworkelementSetPathListResponse +export type NetworkElementServiceSetPathListApiArg = { + networkelementSetPathListRequest: NetworkelementSetPathListRequest +} +export type NetworkElementServiceGetApiResponse = + /** status 200 A successful response. */ GosdnnetworkelementGetResponse +export type NetworkElementServiceGetApiArg = { + mneid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pid?: string +} +export type NetworkElementServiceDeleteApiResponse = + /** status 200 A successful response. */ GosdnnetworkelementDeleteResponse +export type NetworkElementServiceDeleteApiArg = { + mneid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pid?: string +} +export type NetworkElementServiceGetIntendedPathApiResponse = + /** status 200 A successful response. */ NetworkelementGetIntendedPathResponse +export type NetworkElementServiceGetIntendedPathApiArg = { + mneid: string + intendedPath: string + timestamp?: string + pid?: string +} +export type NetworkElementServiceGetPathApiResponse = + /** status 200 A successful response. */ NetworkelementGetPathResponse +export type NetworkElementServiceGetPathApiArg = { + mneid: string + path: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pid?: string +} +export type NetworkElementServiceUpdateApiResponse = + /** status 200 A successful response. */ NetworkelementUpdateNetworkElementResponse +export type NetworkElementServiceUpdateApiArg = { + networkelementUpdateNetworkElementRequest: TodoChangeNameToFitTheRest +} +export type PndServiceGetPndApiResponse = + /** status 200 A successful response. */ PndGetPndResponse +export type PndServiceGetPndApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type PndServiceGetPndListApiResponse = + /** status 200 A successful response. */ PndGetPndListResponse +export type PndServiceGetPndListApiArg = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type PndServiceCreatePndListApiResponse = + /** status 200 A successful response. */ PndCreatePndListResponse +export type PndServiceCreatePndListApiArg = { + pndCreatePndListRequest: PndCreatePndListRequest +} +export type PndServiceDeletePndApiResponse = + /** status 200 A successful response. */ PndDeletePndResponse +export type PndServiceDeletePndApiArg = { + pid: string + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type AppServiceRegisterApiResponse = + /** status 200 A successful response. */ AppAppRegisterResponse +export type AppServiceRegisterApiArg = { + appAppRegisterRequest: AppAppRegisterRequest +} +export type RoleServiceGetRolesApiResponse = + /** status 200 A successful response. */ RbacGetRolesResponse +export type RoleServiceGetRolesApiArg = { + timestamp?: string +} +export type RoleServiceCreateRolesApiResponse = + /** status 200 A successful response. */ RbacCreateRolesResponse +export type RoleServiceCreateRolesApiArg = { + rbacCreateRolesRequest: CreateRoles +} +export type RoleServiceDeleteRolesApiResponse = + /** status 200 A successful response. */ RbacDeleteRolesResponse +export type RoleServiceDeleteRolesApiArg = { + timestamp?: string + roleName?: string[] +} +export type RoleServiceDeletePermissionsForRoleApiResponse = + /** status 200 A successful response. */ RbacDeletePermissionsForRoleResponse +export type RoleServiceDeletePermissionsForRoleApiArg = { + timestamp?: string + roleName?: string + permissionsToDelete?: string[] +} +export type RoleServiceGetRoleApiResponse = + /** status 200 A successful response. */ RbacGetRoleResponse +export type RoleServiceGetRoleApiArg = { + timestamp?: string + roleName?: string + id?: string +} +export type RoleServiceUpdateRolesApiResponse = + /** status 200 A successful response. */ RbacUpdateRolesResponse +export type RoleServiceUpdateRolesApiArg = { + rbacUpdateRolesRequest: UpdateRoles +} +export type RoutingTableServiceGetRoutesApiResponse = + /** status 200 A successful response. */ TopologyGetRoutesResponse +export type RoutingTableServiceGetRoutesApiArg = { + timestamp?: string +} +export type RoutingTableServiceAddRoutingTableApiResponse = + /** status 200 A successful response. */ TopologyAddRoutingTableResponse +export type RoutingTableServiceAddRoutingTableApiArg = { + topologyAddRoutingTableRequest: TopologyAddRoutingTableRequest +} +export type RoutingTableServiceDeleteRouteApiResponse = + /** status 200 A successful response. */ TopologyDeleteRoutesResponse +export type RoutingTableServiceDeleteRouteApiArg = { + timestamp?: string + id?: string +} +export type TopologyServiceGetTopologyApiResponse = + /** status 200 A successful response. */ TopologyGetTopologyResponse +export type TopologyServiceGetTopologyApiArg = { + timestamp?: string +} +export type TopologyServiceAddLinkApiResponse = + /** status 200 A successful response. */ TopologyAddLinkResponse +export type TopologyServiceAddLinkApiArg = { + topologyAddLinkRequest: TopologyAddLinkRequest +} +export type TopologyServiceDeleteLinkApiResponse = + /** status 200 A successful response. */ TopologyDeleteLinkResponse +export type TopologyServiceDeleteLinkApiArg = { + timestamp?: string + id?: string +} +export type TopologyServiceUpdateLinkApiResponse = + /** status 200 A successful response. */ TopologyUpdateLinkResponse +export type TopologyServiceUpdateLinkApiArg = { + topologyUpdateLinkRequest: TopologyUpdateLinkRequest +} +export type UserServiceGetUsersApiResponse = + /** status 200 A successful response. */ RbacGetUsersResponse +export type UserServiceGetUsersApiArg = { + timestamp?: string +} +export type UserServiceCreateUsersApiResponse = + /** status 200 A successful response. */ RbacCreateUsersResponse +export type UserServiceCreateUsersApiArg = { + rbacCreateUsersRequest: CreateUsers +} +export type UserServiceDeleteUsersApiResponse = + /** status 200 A successful response. */ RbacDeleteUsersResponse +export type UserServiceDeleteUsersApiArg = { + timestamp?: string + username?: string[] +} +export type UserServiceGetUserApiResponse = + /** status 200 A successful response. */ RbacGetUserResponse +export type UserServiceGetUserApiArg = { + timestamp?: string + /** TODO(faseid): reconsider if this is necessary as required, but id is not? */ + name?: string + id?: string +} +export type UserServiceUpdateUsersApiResponse = + /** status 200 A successful response. */ RbacUpdateUsersResponse +export type UserServiceUpdateUsersApiArg = { + rbacUpdateUsersRequest: UpdateUsers +} +export type AppAppDeregisterResponse = { + timestamp?: string +} +export type ProtobufAny = { + /** A URL/resource name that uniquely identifies the type of the serialized + protocol buffer message. This string must contain at least + one "/" character. The last segment of the URL's path must represent + the fully qualified name of the type (as in + `path/google.protobuf.Duration`). The name should be in a canonical form + (e.g., leading "." is not accepted). + + In practice, teams usually precompile into the binary all types that they + expect it to use in the context of Any. However, for URLs which use the + scheme `http`, `https`, or no scheme, one can optionally set up a type + server that maps type URLs to message definitions as follows: + + * If no scheme is provided, `https` is assumed. + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the official + protobuf release, and it is not used for type URLs beginning with + type.googleapis.com. As of May 2023, there are no widely used type server + implementations and no plans to implement one. + + Schemes other than `http`, `https` (or the empty scheme) might be + used with implementation specific semantics. */ + '@type'?: string + [key: string]: any +} +export type GooglerpcStatus = { + code?: number + message?: string + details?: ProtobufAny[] +} +export type AppAppDeregisterRequest = { + timestamp?: string + appname?: string +} +export type ConfigurationmanagementExportSdnConfigResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + sdnConfigData?: string +} +export type ConfigurationmanagementImportSdnConfigResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type RbacLoginResponse = { + timestamp?: string + token?: string +} +export type Login = { + timestamp?: string + username?: string + pwd?: string +} +export type RbacLogoutResponse = { + timestamp?: string +} +export type PndPrincipalNetworkDomain = { + id?: string + name?: string + description?: string +} +export type NetworkelementFlattenedManagedNetworkElement = { + id?: string + name?: string + pid?: string + pluginid?: string +} +export type NetworkelementGetAllFlattenedResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mne?: NetworkelementFlattenedManagedNetworkElement[] +} +export type GosdnnetworkelementSetResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + id?: string +} +export type NetworkelementAddListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + responses?: GosdnnetworkelementSetResponse[] +} +export type EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 = + 'JSON' | 'BYTES' | 'PROTO' | 'ASCII' | 'JSON_IETF' +export type TransportGnmiTransportOption = { + compression?: string + grpcDialOptions?: { + [key: string]: string + } + token?: string + encoding?: EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 +} +export type TransportRestconfTransportOption = object +export type ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums = + + | 'TYPE_UNSPECIFIED' + | 'TYPE_OPENCONFIG' + | 'TYPE_CONTAINERISED' + | 'TYPE_PLUGIN' +export type TransportTransportOption = { + address?: string + username?: string + password?: string + tls?: boolean + gnmiTransportOption?: TransportGnmiTransportOption + restconfTransportOption?: TransportRestconfTransportOption + type?: ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums +} +export type NetworkelementSetMne = { + address?: string + pid?: string + pluginId?: string + mneName?: string + transportOption?: TransportTransportOption + gnmiSubscribePaths?: string[] + mneId?: string +} +export type NetworkelementAddListRequest = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + mne?: NetworkelementSetMne[] + pid?: string +} +export type NetworkelementChangeState = + | 'CHANGE_STATE_UNSPECIFIED' + | 'CHANGE_STATE_PENDING' + | 'CHANGE_STATE_COMMITTED' + | 'CHANGE_STATE_CONFIRMED' + | 'CHANGE_STATE_INCONSISTENT' +export type GnmiPathElem = { + /** The name of the element in the path. */ + name?: string + /** Map of key (attribute) name to value. */ + key?: { + [key: string]: string + } +} +export type GnmiPath = { + /** Elements of the path are no longer encoded as a string, but rather within + the elem field as a PathElem message. */ + element?: string[] + /** Label to disambiguate path. */ + origin?: string + /** Elements of the path. */ + elem?: GnmiPathElem[] + target?: string +} +export type GnmiValue = { + /** Value of the variable being transmitted. */ + value?: string + type?: EncodingDefinesTheValueEncodingFormatsThatAreSupportedByTheGNmiProtocolTheseEncodingsAreUsedByBothTheClientWhenSendingSetMessagesToModifyTheStateOfTheTargetAndTheTargetWhenSerializingDataToBeReturnedToTheClientInBothSubscribeAndGetRpCsReferenceGNmiSpecificationSection23 +} +export type GnmiDecimal64 = { + /** Set of digits. */ + digits?: string + /** Number of digits following the decimal point. */ + precision?: number +} +export type GnmiScalarArray = { + /** The set of elements within the array. Each TypedValue message should + specify only elements that have a field identifier of 1-7 (i.e., the + values are scalar values). */ + element?: GnmiTypedValue[] +} +export type GnmiTypedValue = { + /** String value. */ + stringVal?: string + /** Integer value. */ + intVal?: string + /** Unsigned integer value. */ + uintVal?: string + /** Bool value. */ + boolVal?: boolean + /** Arbitrary byte sequence value. */ + bytesVal?: string + /** Floating point value. */ + floatVal?: number + decimalVal?: GnmiDecimal64 + leaflistVal?: GnmiScalarArray + anyVal?: ProtobufAny + /** JSON-encoded text. */ + jsonVal?: string + /** JSON-encoded text per RFC7951. */ + jsonIetfVal?: string + /** Arbitrary ASCII text. */ + asciiVal?: string + /** Protobuf binary encoded bytes. The message type is not included. + See the specification at + github.com/openconfig/reference/blob/master/rpc/gnmi/protobuf-vals.md + for a complete specification. */ + protoBytes?: string +} +export type UpdateIsAReUsableMessageThatIsUsedToStoreAParticularPathValuePairReferenceGNmiSpecificationSection21 = + { + path?: GnmiPath + value?: GnmiValue + val?: GnmiTypedValue + /** Number of coalesced duplicates. */ + duplicates?: number + } +export type NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21 = + { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + prefix?: GnmiPath + alias?: string + /** Data elements that have changed values. */ + update?: UpdateIsAReUsableMessageThatIsUsedToStoreAParticularPathValuePairReferenceGNmiSpecificationSection21[] + /** Data elements that have been deleted. */ + delete?: GnmiPath[] + /** This notification contains a set of paths that are always updated together + referenced by a globally unique prefix. */ + atomic?: boolean + } +export type NetworkelementChange = { + id?: string + age?: string + state?: NetworkelementChangeState + diff?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21 +} +export type NetworkelementGetChangeListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + change?: NetworkelementChange[] +} +export type NetworkelementSetChangeListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + responses?: GosdnnetworkelementSetResponse[] +} +export type GosdnnetworkelementOperation = + | 'OPERATION_UNSPECIFIED' + | 'OPERATION_CREATE' + | 'OPERATION_COMMIT' + | 'OPERATION_CONFIRM' +export type NetworkelementSetChange = { + cuid?: string + op?: GosdnnetworkelementOperation +} +export type NetworkelementSetChangeListRequest = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + change?: NetworkelementSetChange[] + pid?: string +} +export type NetworkelementGetChangeResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + change?: NetworkelementChange[] +} +export type NetworkelementSetPathListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + responses?: GosdnnetworkelementSetResponse[] +} +export type NetworkelementApiOperation = + | 'API_OPERATION_UNSPECIFIED' + | 'API_OPERATION_UPDATE' + | 'API_OPERATION_REPLACE' + | 'API_OPERATION_DELETE' +export type NetworkelementChangeRequest = { + mneid?: string + path?: GnmiPath + value?: GnmiTypedValue + apiOp?: NetworkelementApiOperation +} +export type NetworkelementSetPathListRequest = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + changeRequest?: NetworkelementChangeRequest[] + pid?: string +} +export type PluginRegistryManifest = { + name?: string + firmware?: string + author?: string + version?: string +} +export type PluginRegistryPlugin = { + id?: string + manifest?: PluginRegistryManifest +} +export type ConflictMetadata = { + resourceVersion?: string +} +export type NetworkelementManagedNetworkElement = { + id?: string + name?: string + model?: string + plugin?: PluginRegistryPlugin + mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] + transportAddress?: string + transportOption?: TransportTransportOption + metadata?: ConflictMetadata + associatedPnd?: string + gnmiSubscribePaths?: string[] +} +export type GosdnnetworkelementGetResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mne?: NetworkelementManagedNetworkElement +} +export type GosdnnetworkelementDeleteResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type NetworkelementGetIntendedPathResponse = { + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] +} +export type NetworkelementGetPathResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain + mneNotification?: NotificationIsAReUsableMessageThatIsUsedToEncodeDataFromTheTargetToTheClientANotificationCarriesTwoTypesOfChangesToTheDataTreeDeletedValuesDeleteASetOfPathsThatHaveBeenRemovedFromTheDataTreeUpdatedValuesUpdateASetOfPathValuePairsIndicatingThePathWhoseValueHasChangedInTheDataTreeReferenceGNmiSpecificationSection21[] +} +export type NetworkelementUpdateNetworkElementResponse = { + timestamp?: string +} +export type TodoChangeNameToFitTheRest = { + timestamp?: string + networkElement?: NetworkelementManagedNetworkElement +} +export type PndGetPndResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain +} +export type PndGetPndListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPrincipalNetworkDomain[] +} +export type PndCreatePndListResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type PndPndCreateProperties = { + name?: string + description?: string +} +export type PndCreatePndListRequest = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + pnd?: PndPndCreateProperties[] +} +export type PndDeletePndResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string +} +export type AppAppRegisterResponse = { + timestamp?: string + queueconnection?: string +} +export type AppAppRegisterRequest = { + timestamp?: string + appname?: string + token?: string +} +export type GosdnrbacRole = { + id?: string + name?: string + description?: string + permissions?: string[] +} +export type RbacGetRolesResponse = { + timestamp?: string + roles?: GosdnrbacRole[] +} +export type RbacCreateRolesResponse = { + timestamp?: string +} +export type CreateRoles = { + timestamp?: string + roles?: GosdnrbacRole[] +} +export type RbacDeleteRolesResponse = { + timestamp?: string +} +export type RbacDeletePermissionsForRoleResponse = { + timestamp?: string +} +export type RbacGetRoleResponse = { + timestamp?: string + role?: GosdnrbacRole +} +export type RbacUpdateRolesResponse = { + timestamp?: string +} +export type UpdateRoles = { + timestamp?: string + roles?: GosdnrbacRole[] +} +export type TopologyRoute = { + id?: string + targetIPRange?: string + nextHopIP?: string + portID?: string + metric?: string +} +export type TopologyRoutingTable = { + id?: string + nodeID?: string + routes?: TopologyRoute[] + metadata?: ConflictMetadata +} +export type TopologyGetRoutesResponse = { + timestamp?: string + routingTables?: TopologyRoutingTable[] +} +export type TopologyAddRoutingTableResponse = { + timestamp?: string +} +export type TopologyAddRoutingTableRequest = { + timestamp?: string + routingTable?: TopologyRoutingTable +} +export type TopologyDeleteRoutesResponse = { + timestamp?: string +} +export type TopologyNode = { + id?: string + name?: string + metadata?: ConflictMetadata +} +export type GosdntopologyConfiguration = { + ip?: string + prefixLength?: string +} +export type TopologyPort = { + id?: string + name?: string + configuration?: GosdntopologyConfiguration + metadata?: ConflictMetadata +} +export type TopologyLink = { + id?: string + name?: string + sourceNode?: TopologyNode + targetNode?: TopologyNode + sourcePort?: TopologyPort + targetPort?: TopologyPort + metadata?: ConflictMetadata +} +export type TopologyTopology = { + links?: TopologyLink[] +} +export type TopologyGetTopologyResponse = { + timestamp?: string + toplogy?: TopologyTopology +} +export type TopologyAddLinkResponse = { + timestamp?: string +} +export type TopologyAddLinkRequest = { + timestamp?: string + link?: TopologyLink +} +export type TopologyDeleteLinkResponse = { + timestamp?: string +} +export type TopologyUpdateLinkResponse = { + timestamp?: string +} +export type TopologyUpdateLinkRequest = { + timestamp?: string + link?: TopologyLink +} +export type RbacUser = { + id?: string + name?: string + roles?: { + [key: string]: string + } + password?: string + token?: string + metadata?: ConflictMetadata +} +export type RbacGetUsersResponse = { + timestamp?: string + user?: RbacUser[] +} +export type RbacCreateUsersResponse = { + timestamp?: string +} +export type CreateUsers = { + timestamp?: string + user?: RbacUser[] +} +export type RbacDeleteUsersResponse = { + timestamp?: string +} +export type RbacGetUserResponse = { + timestamp?: string + user?: RbacUser +} +export type RbacUpdateUsersResponse = { + timestamp?: string +} +export type RbacUpdateUser = { + id?: string + name?: string + roles?: { + [key: string]: string + } + password?: string + token?: string + metadata?: ConflictMetadata +} +export type UpdateUsers = { + timestamp?: string + user?: RbacUpdateUser[] +} +export const { + useAppServiceDeregisterMutation, + useConfigurationManagementServiceExportSdnConfigQuery, + useConfigurationManagementServiceImportSdnConfigMutation, + useAuthServiceLoginMutation, + useAuthServiceLogoutMutation, + useNetworkElementServiceGetAllFlattenedQuery, + useNetworkElementServiceAddListMutation, + useNetworkElementServiceGetChangeListQuery, + useNetworkElementServiceSetChangeListMutation, + useNetworkElementServiceGetChangeQuery, + useNetworkElementServiceSetPathListMutation, + useNetworkElementServiceGetQuery, + useNetworkElementServiceDeleteMutation, + useNetworkElementServiceGetIntendedPathQuery, + useNetworkElementServiceGetPathQuery, + useNetworkElementServiceUpdateMutation, + usePndServiceGetPndQuery, + usePndServiceGetPndListQuery, + usePndServiceCreatePndListMutation, + usePndServiceDeletePndMutation, + useAppServiceRegisterMutation, + useRoleServiceGetRolesQuery, + useRoleServiceCreateRolesMutation, + useRoleServiceDeleteRolesMutation, + useRoleServiceDeletePermissionsForRoleMutation, + useRoleServiceGetRoleQuery, + useRoleServiceUpdateRolesMutation, + useRoutingTableServiceGetRoutesQuery, + useRoutingTableServiceAddRoutingTableMutation, + useRoutingTableServiceDeleteRouteMutation, + useTopologyServiceGetTopologyQuery, + useTopologyServiceAddLinkMutation, + useTopologyServiceDeleteLinkMutation, + useTopologyServiceUpdateLinkMutation, + useUserServiceGetUsersQuery, + useUserServiceCreateUsersMutation, + useUserServiceDeleteUsersMutation, + useUserServiceGetUserQuery, + useUserServiceUpdateUsersMutation, +} = injectedRtkApi diff --git a/react-ui/src/utils/icons/icons.ts b/react-ui/src/utils/icons/icons.ts new file mode 100644 index 000000000..00021aa11 --- /dev/null +++ b/react-ui/src/utils/icons/icons.ts @@ -0,0 +1,4 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { faSpinner, fas } from '@fortawesome/free-solid-svg-icons' + +library.add(fas, faSpinner) \ No newline at end of file diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 17feecac2..761bbe683 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -23,7 +23,7 @@ "baseUrl": ".", "paths": { "@assets/*": ["assets/*"], - "@api/*": ["src/api/*"], + "@api/*": ["src/utils/api/*"], "@viewmodel/*": ["src/components/view_model/*"], "@view/*": ["src/components/view/*"], "@reducer/*": ["src/stores/reducer/*"], diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 0e2caf6fd..d5f7d6a21 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -29,7 +29,7 @@ export default defineConfig({ resolve: { alias: { '@assets': '/assets', - '@api': '/src/api', + '@api': '/src/utils/api', "@viewmodel": "/src/components/view_model", "@view": "/src/components/view", "@reducer": "/src/stores/reducer", diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index b08ab4c98..307e75062 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -1494,6 +1494,39 @@ resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== +"@fortawesome/fontawesome-common-types@6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz#31ab07ca6a06358c5de4d295d4711b675006163f" + integrity sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw== + +"@fortawesome/fontawesome-svg-core@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz#2a24c32ef92136e98eae2ff334a27145188295ff" + integrity sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg== + dependencies: + "@fortawesome/fontawesome-common-types" "6.6.0" + +"@fortawesome/free-regular-svg-icons@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.6.0.tgz#fc49a947ac8dfd20403c9ea5f37f0919425bdf04" + integrity sha512-Yv9hDzL4aI73BEwSEh20clrY8q/uLxawaQ98lekBx6t9dQKDHcDzzV1p2YtBGTtolYtNqcWdniOnhzB+JPnQEQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.6.0" + +"@fortawesome/free-solid-svg-icons@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz#061751ca43be4c4d814f0adbda8f006164ec9f3b" + integrity sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA== + dependencies: + "@fortawesome/fontawesome-common-types" "6.6.0" + +"@fortawesome/react-fontawesome@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz#68b058f9132b46c8599875f6a636dad231af78d4" + integrity sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g== + dependencies: + prop-types "^15.8.1" + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" -- GitLab From 9ac24c48ab5775615caf27a23ad7754690cf85e5 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 20 Aug 2024 13:39:43 +0200 Subject: [PATCH 16/78] add navigation logic for redirecting if user is logged in --- .../view/login/{login.tsx => login.view.tsx} | 3 +- .../src/components/view/splash/splash.view.ts | 0 .../components/view_model/login.viewmodel.ts | 61 ++--------- react-ui/src/index.tsx | 25 ++--- react-ui/src/stores/api.store.ts | 2 +- react-ui/src/stores/persist.store.ts | 4 +- react-ui/src/stores/reducer/login.reducer.ts | 49 --------- react-ui/src/stores/reducer/user.reducer.ts | 22 +++- react-ui/src/utils/layouts/auth.layout.tsx | 10 ++ react-ui/src/utils/layouts/login.layout.tsx | 23 ++++ .../src/utils/layouts/protected.layout.tsx | 20 ++++ react-ui/src/utils/provider/auth.provider.tsx | 100 ++++++++++++++++++ react-ui/tsconfig.json | 3 + react-ui/vite.config.mjs | 3 + 14 files changed, 207 insertions(+), 118 deletions(-) rename react-ui/src/components/view/login/{login.tsx => login.view.tsx} (98%) create mode 100644 react-ui/src/components/view/splash/splash.view.ts delete mode 100644 react-ui/src/stores/reducer/login.reducer.ts create mode 100644 react-ui/src/utils/layouts/auth.layout.tsx create mode 100644 react-ui/src/utils/layouts/login.layout.tsx create mode 100644 react-ui/src/utils/layouts/protected.layout.tsx create mode 100644 react-ui/src/utils/provider/auth.provider.tsx diff --git a/react-ui/src/components/view/login/login.tsx b/react-ui/src/components/view/login/login.view.tsx similarity index 98% rename from react-ui/src/components/view/login/login.tsx rename to react-ui/src/components/view/login/login.view.tsx index fe3b6369c..ba8da826e 100644 --- a/react-ui/src/components/view/login/login.tsx +++ b/react-ui/src/components/view/login/login.view.tsx @@ -6,11 +6,10 @@ import logo from '@assets/logo.svg' import useLoginViewModel from '@viewmodel/login.viewmodel' import React, { useRef } from 'react' -const LoginPage = () => { +const LoginPage = ({ children }) => { const { t } = useTranslation('common') const { login, handleErrorMessageRendering, displayFormFieldChecks, loginLoading } = useLoginViewModel(); - const usernameRef = useRef<HTMLInputElement>(null) const passwordRef = useRef<HTMLInputElement>(null) diff --git a/react-ui/src/components/view/splash/splash.view.ts b/react-ui/src/components/view/splash/splash.view.ts new file mode 100644 index 000000000..e69de29bb diff --git a/react-ui/src/components/view_model/login.viewmodel.ts b/react-ui/src/components/view_model/login.viewmodel.ts index 110507a65..ed666d401 100644 --- a/react-ui/src/components/view_model/login.viewmodel.ts +++ b/react-ui/src/components/view_model/login.viewmodel.ts @@ -1,8 +1,7 @@ -import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; -import { setToken } from "@reducer/user.reducer"; -import { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { useDispatch } from "react-redux"; -import { AppDispatch } from "src/stores"; +import { useAppSelector } from "@hooks"; +import { useAuth } from "@provider/auth.provider"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; export interface PageLoginState { submitted: boolean, @@ -10,24 +9,15 @@ export interface PageLoginState { } export default function useLoginViewModel() { - const dispatch = useDispatch<AppDispatch>(); - - const [ - sendLogin, - { data: loginResponse, error: loginError, isLoading: loginLoading, reset: resetLogin } - ] = useAuthServiceLoginMutation() - + const {login, loginProperties} = useAuth(); + const {isLoading: loginLoading, error: loginError, reset: resetLogin} = loginProperties!; + const [localFormState, updateLocalFormState] = useState({ submitted: false, valid: false, }); - - useEffect(() => { - console.log('loginREsponse:' + loginResponse); - }, [loginResponse]) - const handleErrorMessageRendering = (formInvalidError: JSX.Element, backendResponseError: JSX.Element): JSX.Element | null => { // backend response check console.log('loginError:' + loginError); @@ -43,21 +33,6 @@ export default function useLoginViewModel() { return null; } - /** - * Returns the /login payload - */ - const getAuthPayload = (username: string, password: string): AuthServiceLoginApiArg => { - const payload: AuthServiceLoginApiArg = { - rbacLoginRequest: { - username, - pwd: password, - timestamp: new Date().getTime().toString(), - }, - } - - return payload; - } - const isFormValid = (username: string | undefined, password: string | undefined): boolean => { return !!username && !!password; } @@ -71,29 +46,15 @@ export default function useLoginViewModel() { const loginHandler = (username: string | undefined, password: string | undefined) => { resetLogin(); const valid = isFormValid(username, password); - + updateLocalFormState({ ...localFormState, valid, submitted: true }) - + if (valid) { - executeLogin(username!, password!); + //executeLogin(username!, password!); + login(username!, password!); } } - const executeLogin = (username: string, password: string) => { - const authPayload = getAuthPayload(username, password); - - sendLogin(authPayload).unwrap().then((response: AuthServiceLoginApiResponse) => { - if (!response.token) { - // reset the action by calling the reset hook - throw Error("Response is successful but no token was provided. Expected response {token: '<jwt-token>'}"); - } - - dispatch(setToken(response.token)); - }).catch((error) => { - // determine whether 500 or 401 err - }); - } - const displayFormFieldChecks = (): boolean => { return localFormState.submitted && !loginError; } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 8441405d0..42d968e8c 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,24 +1,25 @@ -import './index.scss' import React from 'react' import ReactDOM, { Container } from 'react-dom/client' import { - Outlet, Route, RouterProvider, createBrowserRouter, - createRoutesFromElements, + createRoutesFromElements } from 'react-router-dom' import Landingpage from './components/view/landingpage/landingpage' -import LoginPage from './components/view/login/login' +import './index.scss' -import './i18n/config' -import { I18nextProvider } from 'react-i18next' import i18next from 'i18next' +import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' -import { persistor, store } from './stores' import { ToastContainer } from 'react-toastify' import { PersistGate } from 'redux-persist/integration/react' -import './utils/icons/icons'; +import './i18n/config' +import { persistor, store } from './stores' +import './utils/icons/icons' +import { AuthLayout } from '@layout/auth.layout' +import { ProtectedLayout } from '@layout/protected.layout' +import { LoginLayout } from '@layout/login.layout' const root = ReactDOM.createRoot(document.getElementById('root') as Container) @@ -26,12 +27,12 @@ const root = ReactDOM.createRoot(document.getElementById('root') as Container) // create a proper routing const router = createBrowserRouter( createRoutesFromElements( - <> - <Route element={<Outlet />}> + <Route element={<AuthLayout />}> + <Route path="/login" element={<LoginLayout />} /> + <Route element={<ProtectedLayout/>}> <Route path="/" element={<Landingpage />} /> - <Route path="/login" element={<LoginPage />} /> </Route> - </> + </Route> ) ) diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index a63a9d772..9f9df0e52 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -5,7 +5,7 @@ import { RootState } from '.' export const emptySplitApi = createApi({ baseQuery: fetchBaseQuery({ baseUrl: '/api', prepareHeaders: (headers, { getState }) => { - const token = (getState() as RootState).userReducer.token + const token = (getState() as RootState).user.token if (token) { headers.set('authorization', `Bearer ${token}`) diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index 53e17bffd..39f70ea2f 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,4 +1,3 @@ -import loginReducer from "@reducer/login.reducer"; import userReducer from "@reducer/user.reducer"; import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; @@ -15,8 +14,7 @@ const rootPersistConfig = { const rootReducer = combineReducers({ - userReducer: userReducer, - loginPageReducer: loginReducer, + user: userReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/src/stores/reducer/login.reducer.ts b/react-ui/src/stores/reducer/login.reducer.ts deleted file mode 100644 index 7016aa723..000000000 --- a/react-ui/src/stores/reducer/login.reducer.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { startListening } from '../middleware/listener.middleware'; -import { AuthServiceLoginApiArg, RbacUser, api, useAuthServiceLoginMutation } from '@api/api'; - -const initialState = { - backendResponse: { - valid: false, - send: false - }, - form: { - valid: false, - fields: { - username: '', - password: '' - } - } -} - -const loginSlice = createSlice({ - name: 'page_login', - initialState, - reducers: { - setLoginBackendCheck: (state, action: PayloadAction<boolean>) => { state.backendResponse.send = action.payload }, - - loginSuccess: (state, action: PayloadAction<string>) => { - state.backendResponse.valid = true; - } - }, -}) - -export const { setLoginBackendCheck } = loginSlice.actions - -export default loginSlice.reducer - - -// startListening({ -// actionCreator: setLoginFormFields, - -// effect: async (action, listenerApi) => { -// const payload: AuthServiceLoginApiArg = { -// rbacLoginRequest: { -// username: action.payload.username, -// pwd: action.payload.password, -// timestamp: new Date().getTime().toString(), -// }, -// } -// listenerApi.dispatch(api.endpoints.authServiceLogin.initiate(payload)); -// }, -// }) \ No newline at end of file diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/stores/reducer/user.reducer.ts index d1a3c99ca..478acb1c3 100644 --- a/react-ui/src/stores/reducer/user.reducer.ts +++ b/react-ui/src/stores/reducer/user.reducer.ts @@ -1,5 +1,6 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; import { RbacUser } from '../../utils/api/api'; +import { startListening } from '../middleware/listener.middleware'; export interface UserSliceState { token: string, @@ -24,4 +25,23 @@ const userSlice = createSlice({ export const { setToken } = userSlice.actions export default userSlice.reducer -export const userReducerPath = userSlice.reducerPath; \ No newline at end of file +export const userReducerPath = userSlice.reducerPath; + + + +startListening({ + actionCreator: setToken, + + effect: async (action, listenerApi) => { + + + // const payload: AuthServiceLoginApiArg = { + // rbacLoginRequest: { + // username: action.payload.username, + // pwd: action.payload.password, + // timestamp: new Date().getTime().toString(), + // }, + // } + // listenerApi.dispatch(api.endpoints.authServiceLogin.initiate(payload)); + }, +}) \ No newline at end of file diff --git a/react-ui/src/utils/layouts/auth.layout.tsx b/react-ui/src/utils/layouts/auth.layout.tsx new file mode 100644 index 000000000..84c717264 --- /dev/null +++ b/react-ui/src/utils/layouts/auth.layout.tsx @@ -0,0 +1,10 @@ +import { AuthProvider } from "@provider/auth.provider"; +import { useOutlet } from "react-router-dom" + +export const AuthLayout = () => { + const outlet = useOutlet(); + + return ( + <AuthProvider>{outlet}</AuthProvider> + ) +} \ No newline at end of file diff --git a/react-ui/src/utils/layouts/login.layout.tsx b/react-ui/src/utils/layouts/login.layout.tsx new file mode 100644 index 000000000..e2c9b4a12 --- /dev/null +++ b/react-ui/src/utils/layouts/login.layout.tsx @@ -0,0 +1,23 @@ +import { useAppSelector } from "@hooks"; +import LoginPage from "@view/login/login.view"; +import { useEffect } from "react"; +import { useNavigate, useOutlet } from "react-router-dom"; + + +// if user is already logged in then redirect to home page +export const LoginLayout = ({ children }) => { + const outlet = useOutlet(); + const { token } = useAppSelector(state => state.user); + const navigate = useNavigate(); + + useEffect(() => { + if (!!token) { + navigate('/'); + return; + } + }); + + return ( + <LoginPage>{outlet}</LoginPage> + ) +} \ No newline at end of file diff --git a/react-ui/src/utils/layouts/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout.tsx new file mode 100644 index 000000000..e938c2f19 --- /dev/null +++ b/react-ui/src/utils/layouts/protected.layout.tsx @@ -0,0 +1,20 @@ +import { Link, Navigate, Outlet } from "react-router-dom"; +import { useAppSelector } from '../../hooks'; + +export const ProtectedLayout = () => { + const { token } = useAppSelector(state => state.user); + + if (!!!token) { + return <Navigate to="/login" />; + } + + return ( + <div> + <nav> + <Link to="/settings">Settings</Link> + <Link to="/profile">Profile</Link> + </nav> + <Outlet /> + </div> + ) +}; \ No newline at end of file diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/utils/provider/auth.provider.tsx new file mode 100644 index 000000000..9e1e09c5c --- /dev/null +++ b/react-ui/src/utils/provider/auth.provider.tsx @@ -0,0 +1,100 @@ +import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; +import { setToken } from "@reducer/user.reducer"; +import { createContext, useContext, useMemo } from "react"; +import { useDispatch } from "react-redux"; +import { redirect, useNavigate } from "react-router-dom"; +import { AppDispatch } from "src/stores"; + +interface AuthProviderType { + login: (username: string, password: string) => void, + logout: () => void, + // todo figure out the type of loginProperties + loginProperties: { + isLoading: boolean, + isSuccess: boolean, + isError: boolean, + error: object, + data: object, + reset: () => void + } | undefined +} + + +const AuthContext = createContext<AuthProviderType>({ + login: () => { throw new Error("login function not implemented"); }, + logout: () => { throw new Error("logout function not implemented"); }, + loginProperties: undefined, +}); + +export const AuthProvider = ({ children }) => { + + const dispatch = useDispatch<AppDispatch>(); + const navigate = useNavigate(); + + const [ + sendLogin, + loginProperties, + ] = useAuthServiceLoginMutation() + + + /** + * Returns the /login payload + */ + const getAuthPayload = (username: string, password: string): AuthServiceLoginApiArg => { + const payload: AuthServiceLoginApiArg = { + rbacLoginRequest: { + username, + pwd: password, + timestamp: new Date().getTime().toString(), + }, + } + + return payload; + } + + const executeLogin = (username: string, password: string) => { + const authPayload = getAuthPayload(username, password); + + sendLogin(authPayload).unwrap().then((response: AuthServiceLoginApiResponse) => { + if (!response.token) { + // reset the action by calling the reset hook + throw Error("Response is successful but no token was provided. Expected response {token: '<jwt-token>'}"); + } + + dispatch(setToken(response.token)); + + + navigate('/'); + }).catch((error) => { + // determine whether 500 or 401 err + }); + } + + const login = (username: string, password: string) => { + executeLogin(username, password); + } + + const logout = () => { + // TODO + } + + const value = useMemo( + () => ({ + login, + logout, + loginProperties + }), + [] + ); + + return ( + <AuthContext.Provider value={value}> + {children} + </AuthContext.Provider> + ) +} + + +export const useAuth = () => { + return useContext(AuthContext); +} diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 761bbe683..b8c8c0625 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -27,6 +27,9 @@ "@viewmodel/*": ["src/components/view_model/*"], "@view/*": ["src/components/view/*"], "@reducer/*": ["src/stores/reducer/*"], + "@provider/*": ["src/utils/provider/*"], + "@layout/*": ["src/utils/layouts/*"], + "@hooks": ["src/hooks"], } }, "include": [ diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index d5f7d6a21..c52ee47ca 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -33,6 +33,9 @@ export default defineConfig({ "@viewmodel": "/src/components/view_model", "@view": "/src/components/view", "@reducer": "/src/stores/reducer", + "@provider": "/src/utils/provider", + "@layout": "/src/utils/layouts", + "@hooks": "/src/hooks.ts", }, }, -- GitLab From e73f0608486964ba11ef4b99f51c0c08779c6ec6 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Fri, 23 Aug 2024 13:57:37 +0200 Subject: [PATCH 17/78] [feat] implement scheduler --- react-ui/package.json | 1 + .../components/view_model/login.viewmodel.ts | 3 - react-ui/src/index.tsx | 10 +-- react-ui/src/stores/persist.store.ts | 2 + .../src/stores/reducer/schedule.reducer.ts | 70 +++++++++++++++++++ react-ui/src/stores/reducer/user.reducer.ts | 8 ++- react-ui/src/utils/layouts/auth.layout.tsx | 17 +++-- react-ui/src/utils/layouts/login.layout.tsx | 10 +-- .../src/utils/layouts/protected.layout.tsx | 20 ++++-- react-ui/src/utils/provider/auth.provider.tsx | 52 ++++++++++---- .../src/utils/provider/fetch.provider.tsx | 21 ++++++ react-ui/src/utils/scheduler.tsx | 20 ++++++ react-ui/yarn.lock | 5 ++ 13 files changed, 199 insertions(+), 40 deletions(-) create mode 100644 react-ui/src/stores/reducer/schedule.reducer.ts create mode 100644 react-ui/src/utils/provider/fetch.provider.tsx create mode 100644 react-ui/src/utils/scheduler.tsx diff --git a/react-ui/package.json b/react-ui/package.json index f1941701c..966d60eec 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -13,6 +13,7 @@ "@testing-library/user-event": "^14.5.2", "bootstrap": "^5.3.3", "i18next": "^23.11.5", + "jwt-decode": "^4.0.0", "react": "^18.3.1", "react-bootstrap": "^2.10.2", "react-dom": "^18.3.1", diff --git a/react-ui/src/components/view_model/login.viewmodel.ts b/react-ui/src/components/view_model/login.viewmodel.ts index ed666d401..93f4c33f2 100644 --- a/react-ui/src/components/view_model/login.viewmodel.ts +++ b/react-ui/src/components/view_model/login.viewmodel.ts @@ -1,7 +1,5 @@ -import { useAppSelector } from "@hooks"; import { useAuth } from "@provider/auth.provider"; import { useState } from "react"; -import { useNavigate } from "react-router-dom"; export interface PageLoginState { submitted: boolean, @@ -20,7 +18,6 @@ export default function useLoginViewModel() { const handleErrorMessageRendering = (formInvalidError: JSX.Element, backendResponseError: JSX.Element): JSX.Element | null => { // backend response check - console.log('loginError:' + loginError); if (!!loginError) { return backendResponseError; } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 42d968e8c..899630387 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -9,6 +9,9 @@ import { import Landingpage from './components/view/landingpage/landingpage' import './index.scss' +import { BasicLayout } from '@layout/auth.layout' +import { LoginLayout } from '@layout/login.layout' +import { ProtectedLayout } from '@layout/protected.layout' import i18next from 'i18next' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' @@ -17,9 +20,6 @@ import { PersistGate } from 'redux-persist/integration/react' import './i18n/config' import { persistor, store } from './stores' import './utils/icons/icons' -import { AuthLayout } from '@layout/auth.layout' -import { ProtectedLayout } from '@layout/protected.layout' -import { LoginLayout } from '@layout/login.layout' const root = ReactDOM.createRoot(document.getElementById('root') as Container) @@ -27,9 +27,9 @@ const root = ReactDOM.createRoot(document.getElementById('root') as Container) // create a proper routing const router = createBrowserRouter( createRoutesFromElements( - <Route element={<AuthLayout />}> + <Route element={<BasicLayout />}> <Route path="/login" element={<LoginLayout />} /> - <Route element={<ProtectedLayout/>}> + <Route element={<ProtectedLayout />}> <Route path="/" element={<Landingpage />} /> </Route> </Route> diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index 39f70ea2f..806b6e2e1 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -3,6 +3,7 @@ import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; import storage from "redux-persist/es/storage"; import { emptySplitApi } from "./api.store"; +import scheduleReducer from "@reducer/schedule.reducer"; /** local storage config */ @@ -15,6 +16,7 @@ const rootPersistConfig = { const rootReducer = combineReducers({ user: userReducer, + scheduler: scheduleReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/src/stores/reducer/schedule.reducer.ts b/react-ui/src/stores/reducer/schedule.reducer.ts new file mode 100644 index 000000000..345b26bf2 --- /dev/null +++ b/react-ui/src/stores/reducer/schedule.reducer.ts @@ -0,0 +1,70 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { startListening } from '../middleware/listener.middleware'; + +export enum ScheduleState { INIT, RUNNING, STOPPED } + +type Task<T> = (options: T) => void; + +interface Schedule<T> { + f: Task<T>, + interval: number, + id: number, + state: ScheduleState, + intervalId: NodeJS.Timeout | undefined +} + +export interface ScheduleReducerState { + schedules: Schedule<any>[] +} + +const initialState: ScheduleReducerState = { + schedules: [] +} + +const ScheduleSlice = createSlice({ + name: 'schedule', + initialState, + reducers: { + addSchedule: (state, action: PayloadAction<{ task: Task<any>, interval: number }>) => { + const newSchedule = { + f: action.payload.task, + interval: action.payload.interval, + id: state.schedules.length, + state: ScheduleState.INIT, + intervalId: undefined + } + + state.schedules = [...state.schedules, newSchedule] + }, + startSchedule: (state, action: PayloadAction<Schedule<any>>) => { + const schedule = action.payload; + schedule.intervalId = setInterval(schedule.f, schedule.interval); + schedule.state = ScheduleState.RUNNING; + + state.schedules[schedule.id] = schedule; + }, + }, +}) + +export const { addSchedule } = ScheduleSlice.actions +export const { startSchedule } = ScheduleSlice.actions + +export default ScheduleSlice.reducer + + +startListening({ + actionCreator: addSchedule, + + effect: (action, listenerApi) => { + const newState = listenerApi.getState() as ScheduleReducerState; + const originalState = listenerApi.getOriginalState() as ScheduleReducerState; + + // get the added schedule + const schedule = newState.schedules.filter(s => !originalState.schedules.includes(s)).at(0); + if (!schedule) { + throw new Error("Added schedule not found in store"); + } + + listenerApi.dispatch(startSchedule(schedule)) + }, +}) \ No newline at end of file diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/stores/reducer/user.reducer.ts index 478acb1c3..e1071968b 100644 --- a/react-ui/src/stores/reducer/user.reducer.ts +++ b/react-ui/src/stores/reducer/user.reducer.ts @@ -1,6 +1,7 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit'; import { RbacUser } from '../../utils/api/api'; import { startListening } from '../middleware/listener.middleware'; +import { useNavigate } from 'react-router-dom'; export interface UserSliceState { token: string, @@ -13,12 +14,13 @@ const initialState: UserSliceState = { user: null } - const userSlice = createSlice({ name: 'user', initialState, reducers: { - setToken: (state, action: PayloadAction<string>) => { state.token = action.payload }, + setToken: (state, action: PayloadAction<string>) => { + state.token = action.payload + }, }, }) diff --git a/react-ui/src/utils/layouts/auth.layout.tsx b/react-ui/src/utils/layouts/auth.layout.tsx index 84c717264..a38da03a9 100644 --- a/react-ui/src/utils/layouts/auth.layout.tsx +++ b/react-ui/src/utils/layouts/auth.layout.tsx @@ -1,10 +1,19 @@ import { AuthProvider } from "@provider/auth.provider"; -import { useOutlet } from "react-router-dom" +import { useEffect } from "react"; +import { useOutlet } from "react-router-dom"; +import { ScheduleProvider } from "../scheduler"; -export const AuthLayout = () => { +export const BasicLayout = () => { const outlet = useOutlet(); - + const { initSchedules } = ScheduleProvider(); + + useEffect(() => { + initSchedules(); + }, []) + return ( - <AuthProvider>{outlet}</AuthProvider> + <AuthProvider> + {outlet} + </AuthProvider> ) } \ No newline at end of file diff --git a/react-ui/src/utils/layouts/login.layout.tsx b/react-ui/src/utils/layouts/login.layout.tsx index e2c9b4a12..08a875f75 100644 --- a/react-ui/src/utils/layouts/login.layout.tsx +++ b/react-ui/src/utils/layouts/login.layout.tsx @@ -1,21 +1,21 @@ -import { useAppSelector } from "@hooks"; +import { useAuth } from "@provider/auth.provider"; import LoginPage from "@view/login/login.view"; import { useEffect } from "react"; import { useNavigate, useOutlet } from "react-router-dom"; -// if user is already logged in then redirect to home page export const LoginLayout = ({ children }) => { const outlet = useOutlet(); - const { token } = useAppSelector(state => state.user); const navigate = useNavigate(); + const { isAuthenticated } = useAuth(); + // if user is already logged in then redirect to home page useEffect(() => { - if (!!token) { + if (isAuthenticated()) { navigate('/'); return; } - }); + }, []); return ( <LoginPage>{outlet}</LoginPage> diff --git a/react-ui/src/utils/layouts/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout.tsx index e938c2f19..4c774b733 100644 --- a/react-ui/src/utils/layouts/protected.layout.tsx +++ b/react-ui/src/utils/layouts/protected.layout.tsx @@ -1,18 +1,24 @@ -import { Link, Navigate, Outlet } from "react-router-dom"; -import { useAppSelector } from '../../hooks'; +import { useAuth } from "@provider/auth.provider"; +import { useEffect } from "react"; +import { Button } from "react-bootstrap"; +import { Link, Outlet, useNavigate } from "react-router-dom"; export const ProtectedLayout = () => { - const { token } = useAppSelector(state => state.user); - - if (!!!token) { - return <Navigate to="/login" />; - } + const { isAuthenticated, logout } = useAuth(); + const navigate = useNavigate(); + useEffect(() => { + if (!isAuthenticated()) { + navigate('/login') + } + }, []); + return ( <div> <nav> <Link to="/settings">Settings</Link> <Link to="/profile">Profile</Link> + <Button onClick={logout}>logout</Button> </nav> <Outlet /> </div> diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/utils/provider/auth.provider.tsx index 9e1e09c5c..a741ef708 100644 --- a/react-ui/src/utils/provider/auth.provider.tsx +++ b/react-ui/src/utils/provider/auth.provider.tsx @@ -1,9 +1,9 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; +import { useAppDispatch, useAppSelector } from "@hooks"; import { setToken } from "@reducer/user.reducer"; -import { createContext, useContext, useMemo } from "react"; -import { useDispatch } from "react-redux"; -import { redirect, useNavigate } from "react-router-dom"; -import { AppDispatch } from "src/stores"; +import { jwtDecode } from "jwt-decode"; +import { createContext, useContext, useEffect, useMemo } from "react"; +import { useNavigate } from "react-router-dom"; interface AuthProviderType { login: (username: string, password: string) => void, @@ -16,26 +16,37 @@ interface AuthProviderType { error: object, data: object, reset: () => void - } | undefined + } | undefined, + isAuthenticated: () => boolean } - const AuthContext = createContext<AuthProviderType>({ login: () => { throw new Error("login function not implemented"); }, logout: () => { throw new Error("logout function not implemented"); }, loginProperties: undefined, + isAuthenticated: () => { throw new Error("login function not implemented"); }, }); export const AuthProvider = ({ children }) => { - - const dispatch = useDispatch<AppDispatch>(); + const dispatch = useAppDispatch();; const navigate = useNavigate(); + const { token } = useAppSelector(state => state.user); + + useEffect(() => { + console.log('auth provider init'); + + if (isAuthenticated()) { + navigate('/') + }else { + navigate('/login') + } + }, []); const [ sendLogin, loginProperties, ] = useAuthServiceLoginMutation() - + /** * Returns the /login payload @@ -62,8 +73,6 @@ export const AuthProvider = ({ children }) => { } dispatch(setToken(response.token)); - - navigate('/'); }).catch((error) => { // determine whether 500 or 401 err @@ -74,14 +83,32 @@ export const AuthProvider = ({ children }) => { executeLogin(username, password); } + const isAuthenticated = () => { + if (!token) { + return false; + } + + const { exp } = jwtDecode(token); + const currentTime = new Date().getTime() / 1000; + + // TODO this is currently a workaround for the never expiring token + if (process.env.NODE_ENV === 'development') { + return !!token; + }else { + return !!token && exp! > currentTime; + } + } + const logout = () => { - // TODO + dispatch(setToken("")); + // TODO: purge other information } const value = useMemo( () => ({ login, logout, + isAuthenticated, loginProperties }), [] @@ -94,7 +121,6 @@ export const AuthProvider = ({ children }) => { ) } - export const useAuth = () => { return useContext(AuthContext); } diff --git a/react-ui/src/utils/provider/fetch.provider.tsx b/react-ui/src/utils/provider/fetch.provider.tsx new file mode 100644 index 000000000..9db4e121c --- /dev/null +++ b/react-ui/src/utils/provider/fetch.provider.tsx @@ -0,0 +1,21 @@ +import { useAppSelector } from "@hooks"; +import { useAuth } from "./auth.provider" + + +// seconds before token expire to trigger a refetch +const REFETCH_TOKEN_TIME = 43200; + +const FetchProvider = () => { + const { isAuthenticated: isAuthed } = useAuth(); + const { token } = useAppSelector((root) => root.user); + + + const checkFetch = (): boolean => { + const { exp } = jwtDecode(token); + const currentTime = new Date().getTime() / 1000; + + return exp + } + + return +} \ No newline at end of file diff --git a/react-ui/src/utils/scheduler.tsx b/react-ui/src/utils/scheduler.tsx new file mode 100644 index 000000000..51bf94de3 --- /dev/null +++ b/react-ui/src/utils/scheduler.tsx @@ -0,0 +1,20 @@ +import { useAppSelector } from "@hooks"; +import { startSchedule } from "@reducer/schedule.reducer"; +import { useDispatch } from "react-redux"; +import { AppDispatch } from "src/stores"; + +export const ScheduleProvider = () => { + const dispatch = useDispatch<AppDispatch>(); + const { schedules } = useAppSelector(state => state.scheduler); + + + const initSchedules = () => { + schedules.forEach(schedule => { + dispatch(startSchedule(schedule)); + }) + } + + return { + initSchedules + } +} diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 307e75062..a43298625 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -6963,6 +6963,11 @@ jsonpointer@^5.0.0: object.assign "^4.1.4" object.values "^1.1.6" +jwt-decode@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" + integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== + keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" -- GitLab From 0169f4d4fc6e75331ff86a37b084681ab86f68d4 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Sun, 25 Aug 2024 23:29:34 +0200 Subject: [PATCH 18/78] (feat) add generic navigation bar --- .../view/landingpage/landingpage.scss | 39 ------- .../view/landingpage/landingpage.tsx | 16 +-- .../src/i18n/locales/en/translations.json | 8 ++ react-ui/src/index.tsx | 2 +- react-ui/src/style/colors.scss | 2 + react-ui/src/style/utils.scss | 10 ++ .../src/utils/layouts/protected.layout.tsx | 26 ----- .../protected.layout/protected.layout.scss | 23 ++++ .../protected.layout/protected.layout.tsx | 107 ++++++++++++++++++ 9 files changed, 152 insertions(+), 81 deletions(-) delete mode 100644 react-ui/src/utils/layouts/protected.layout.tsx create mode 100644 react-ui/src/utils/layouts/protected.layout/protected.layout.scss create mode 100644 react-ui/src/utils/layouts/protected.layout/protected.layout.tsx diff --git a/react-ui/src/components/view/landingpage/landingpage.scss b/react-ui/src/components/view/landingpage/landingpage.scss index a46d992e7..e69de29bb 100644 --- a/react-ui/src/components/view/landingpage/landingpage.scss +++ b/react-ui/src/components/view/landingpage/landingpage.scss @@ -1,39 +0,0 @@ - -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/react-ui/src/components/view/landingpage/landingpage.tsx b/react-ui/src/components/view/landingpage/landingpage.tsx index b8cb71bc0..62c358639 100644 --- a/react-ui/src/components/view/landingpage/landingpage.tsx +++ b/react-ui/src/components/view/landingpage/landingpage.tsx @@ -1,23 +1,9 @@ import './landingpage.scss' -import logo from '@assets/logo.svg' function Landingpage() { return ( <div className="App"> - <header className="App-header"> - <img src={logo} className="App-logo" alt="logo" /> - <p> - Edit <code>src/App.js</code> and save to reload. - </p> - <a - className="App-link" - href="https://reactjs.org" - target="_blank" - rel="noopener noreferrer" - > - Learn React - </a> - </header> + </div> ) } diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index 12ffef164..d46896a8c 100644 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -17,6 +17,14 @@ "label": "Password" } } + }, + "protected": { + "link": { + "device_list": "Device List", + "map": "Map", + "configuration_mgmt": "Configuration Management", + "settings": "Settings" + } } } } \ No newline at end of file diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 899630387..50f9c3509 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -11,7 +11,7 @@ import './index.scss' import { BasicLayout } from '@layout/auth.layout' import { LoginLayout } from '@layout/login.layout' -import { ProtectedLayout } from '@layout/protected.layout' +import { ProtectedLayout } from '@layout/protected.layout/protected.layout' import i18next from 'i18next' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' diff --git a/react-ui/src/style/colors.scss b/react-ui/src/style/colors.scss index a10e9eafe..80e75f8b7 100644 --- a/react-ui/src/style/colors.scss +++ b/react-ui/src/style/colors.scss @@ -3,6 +3,8 @@ $theme-colors: ( 'bg-primary': #E1E1E1, 'danger': #ffdcdc, 'warning': #dbd116, + 'dark': #595959, + 'black': #000000, ); @import '/node_modules/bootstrap/scss/bootstrap'; diff --git a/react-ui/src/style/utils.scss b/react-ui/src/style/utils.scss index 9485a52c6..9dd71c4b8 100644 --- a/react-ui/src/style/utils.scss +++ b/react-ui/src/style/utils.scss @@ -1,3 +1,13 @@ .vh-100 { height: 100vh !important; +} + +.clickable { + &:hover { + cursor: pointer; + } +} + +.icon { + font-size: 1.75em; } \ No newline at end of file diff --git a/react-ui/src/utils/layouts/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout.tsx deleted file mode 100644 index 4c774b733..000000000 --- a/react-ui/src/utils/layouts/protected.layout.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useAuth } from "@provider/auth.provider"; -import { useEffect } from "react"; -import { Button } from "react-bootstrap"; -import { Link, Outlet, useNavigate } from "react-router-dom"; - -export const ProtectedLayout = () => { - const { isAuthenticated, logout } = useAuth(); - const navigate = useNavigate(); - - useEffect(() => { - if (!isAuthenticated()) { - navigate('/login') - } - }, []); - - return ( - <div> - <nav> - <Link to="/settings">Settings</Link> - <Link to="/profile">Profile</Link> - <Button onClick={logout}>logout</Button> - </nav> - <Outlet /> - </div> - ) -}; \ No newline at end of file diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.scss b/react-ui/src/utils/layouts/protected.layout/protected.layout.scss new file mode 100644 index 000000000..eb713fa7a --- /dev/null +++ b/react-ui/src/utils/layouts/protected.layout/protected.layout.scss @@ -0,0 +1,23 @@ +@import "/src/style/colors.scss"; + +.head-links { + text-decoration: none; + color: map-get($theme-colors, dark); + font-weight: 500; + margin-right: 20px; + + &:hover { + color: map-get($theme-colors, primary); + font-weight: 600; + } + + &.active { + color: map-get($theme-colors, primary); + font-weight: 600; + } +} + +.sidebar { + width: 4.5em; + height: 100vh; +} diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx new file mode 100644 index 000000000..43ac08f2d --- /dev/null +++ b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx @@ -0,0 +1,107 @@ +import { useAuth } from "@provider/auth.provider"; +import { useEffect, useState } from "react"; +import { Button, Dropdown, DropdownButton, Form } from "react-bootstrap"; +import { Link, Outlet, useNavigate } from "react-router-dom"; +import logo from '@assets/logo.svg'; +import "./protected.layout.scss"; +import { useTranslation } from "react-i18next"; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleUser, faRightFromBracket, faUser } from "@fortawesome/free-solid-svg-icons"; +import React from "react"; + + + + +export const ProtectedLayout = () => { + const { isAuthenticated, logout } = useAuth(); + const navigate = useNavigate(); + const { t } = useTranslation('common') + + useEffect(() => { + if (!isAuthenticated()) { + navigate('/login') + } + }, []); + + /** + * Applies active css class to link if the link is active + */ + const handleActiveLink = (targetPath: string): string => { + const href = window.location.href; + console.log(href); + + + return href.includes(targetPath) ? ' active' : ''; + } + + function UserDropDown() { + return ( + <DropdownButton id="dropdown-basic-button" title="Dropdown button"> + <Dropdown.Item href="#/action-1">Action</Dropdown.Item> + <Dropdown.Item href="#/action-2">Another action</Dropdown.Item> + <Dropdown.Item href="#/action-3">Something else</Dropdown.Item> + </DropdownButton> + ); + } + + const UserIconToggle = React.forwardRef(({ children, onClick }, ref) => ( + <div + href="" + ref={ref} + onClick={(e) => { + e.preventDefault(); + onClick(e); + }} + > + {children} + </div> + )); + + const UserIconMenu = React.forwardRef( + ({ children, style, className, 'aria-labelledby': labeledBy }, ref) => { + return ( + <div + ref={ref} + style={style} + className={className} + aria-labelledby={labeledBy} + > + <ul className="list-unstyled"> + {React.Children.toArray(children)} + </ul> + </div> + ); + } + ); + + + return ( + <div> + <nav className="bg-white border-bottom border-dark py-2 d-flex align-items-center"> + <Link to="/"><img src={logo} className="mx-4 me-5" width={25} alt="logo" /></Link> + <Link className={"head-links" + handleActiveLink('/')} to="/">{t('protected.link.device_list')}</Link> + <Link className={"head-links" + handleActiveLink('/map')} to="/">{t('protected.link.map')}</Link> + <Link className={"head-links" + handleActiveLink('/configuration_management')} to="/">{t('protected.link.configuration_mgmt')}</Link> + + <Dropdown className="ms-auto px-3"> + <Dropdown.Toggle as={UserIconToggle}> + <FontAwesomeIcon icon={faCircleUser} className="icon clickable" /> + </Dropdown.Toggle> + + <Dropdown.Menu as={UserIconMenu}> + <Dropdown.Item eventKey="1">matthias.feyll@stud.h-da.de</Dropdown.Item> + <Dropdown.Item eventKey="1"> + <Link className="text-decoration-none text-reset" to="/">{t('protected.link.settings')}</Link> + </Dropdown.Item> + </Dropdown.Menu> + </Dropdown> + + + </nav> + <div className="d-flex fixed-top z-n1 flex-column flex-shrink-0 bg-white sidebar justify-content-end border-end border-dark py-3"> + <FontAwesomeIcon className="clickable icon" icon={faRightFromBracket} onClick={logout} size="2x" /> + </div> + <Outlet /> + </div> + ) +}; \ No newline at end of file -- GitLab From 9b3bc3c692ba73ba1ad85e5fe610e102acc5f140 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Sun, 25 Aug 2024 23:42:02 +0200 Subject: [PATCH 19/78] (refactor) cleanup generic header and sidebar navigation --- .../protected.layout/protected.layout.tsx | 57 +++++++++---------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx index 43ac08f2d..c0ef7d1a4 100644 --- a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx @@ -1,15 +1,12 @@ +import logo from '@assets/logo.svg'; +import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useAuth } from "@provider/auth.provider"; -import { useEffect, useState } from "react"; -import { Button, Dropdown, DropdownButton, Form } from "react-bootstrap"; +import React, { useEffect } from "react"; +import { Dropdown } from "react-bootstrap"; +import { useTranslation } from "react-i18next"; import { Link, Outlet, useNavigate } from "react-router-dom"; -import logo from '@assets/logo.svg'; import "./protected.layout.scss"; -import { useTranslation } from "react-i18next"; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faCircleUser, faRightFromBracket, faUser } from "@fortawesome/free-solid-svg-icons"; -import React from "react"; - - export const ProtectedLayout = () => { @@ -34,31 +31,22 @@ export const ProtectedLayout = () => { return href.includes(targetPath) ? ' active' : ''; } - function UserDropDown() { - return ( - <DropdownButton id="dropdown-basic-button" title="Dropdown button"> - <Dropdown.Item href="#/action-1">Action</Dropdown.Item> - <Dropdown.Item href="#/action-2">Another action</Dropdown.Item> - <Dropdown.Item href="#/action-3">Something else</Dropdown.Item> - </DropdownButton> - ); - } - - const UserIconToggle = React.forwardRef(({ children, onClick }, ref) => ( + /** renders the corpus for the user icon dropdown */ + const UserIconToggle = React.forwardRef(({ children, onClick }: React.LinkHTMLAttributes<any>, ref: any) => ( <div - href="" ref={ref} onClick={(e) => { e.preventDefault(); - onClick(e); + onClick!(e); }} > {children} </div> )); + /** renders the single items inside the user dropdown corpus */ const UserIconMenu = React.forwardRef( - ({ children, style, className, 'aria-labelledby': labeledBy }, ref) => { + ({ children, style, className, 'aria-labelledby': labeledBy }: React.LinkHTMLAttributes<any>, ref: any) => { return ( <div ref={ref} @@ -74,9 +62,16 @@ export const ProtectedLayout = () => { } ); + const VerticalSidebar = () => { + return ( + <div className="d-flex fixed-top z-n1 flex-column flex-shrink-0 bg-white sidebar justify-content-end border-end border-dark py-3"> + <FontAwesomeIcon className="clickable icon" icon={faRightFromBracket} onClick={logout} size="2x" /> + </div> + ) + } - return ( - <div> + const HorizontalNavbar = () => { + return ( <nav className="bg-white border-bottom border-dark py-2 d-flex align-items-center"> <Link to="/"><img src={logo} className="mx-4 me-5" width={25} alt="logo" /></Link> <Link className={"head-links" + handleActiveLink('/')} to="/">{t('protected.link.device_list')}</Link> @@ -95,12 +90,14 @@ export const ProtectedLayout = () => { </Dropdown.Item> </Dropdown.Menu> </Dropdown> - - </nav> - <div className="d-flex fixed-top z-n1 flex-column flex-shrink-0 bg-white sidebar justify-content-end border-end border-dark py-3"> - <FontAwesomeIcon className="clickable icon" icon={faRightFromBracket} onClick={logout} size="2x" /> - </div> + ) + } + + return ( + <div> + {HorizontalNavbar()} + {VerticalSidebar()} <Outlet /> </div> ) -- GitLab From 173f3364575bcae43964c958d6c79bc353fb70a3 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 26 Aug 2024 01:50:43 +0200 Subject: [PATCH 20/78] (feat) fetch user in background --- react-ui/src/stores/api.store.ts | 2 +- react-ui/src/stores/reducer/user.reducer.ts | 51 +++++++++++++------ .../protected.layout/protected.layout.tsx | 5 +- react-ui/src/utils/provider/auth.provider.tsx | 18 +++---- 4 files changed, 47 insertions(+), 29 deletions(-) diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index 9f9df0e52..bd36b8227 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -8,7 +8,7 @@ export const emptySplitApi = createApi({ const token = (getState() as RootState).user.token if (token) { - headers.set('authorization', `Bearer ${token}`) + headers.set('authorize', `${token}`) } return headers diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/stores/reducer/user.reducer.ts index e1071968b..b1d5f99cd 100644 --- a/react-ui/src/stores/reducer/user.reducer.ts +++ b/react-ui/src/stores/reducer/user.reducer.ts @@ -1,30 +1,36 @@ -import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit'; -import { RbacUser } from '../../utils/api/api'; +import { api, RbacUser, UserServiceGetUsersApiArg } from '@api/api'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { startListening } from '../middleware/listener.middleware'; -import { useNavigate } from 'react-router-dom'; +import { RootState } from '..'; export interface UserSliceState { token: string, + // defined by the frontend user input. This value is getting compared with the backend response + username: string, user: RbacUser | null, } const initialState: UserSliceState = { token: '', - user: null + username: '', + user: null, } const userSlice = createSlice({ name: 'user', initialState, reducers: { - setToken: (state, action: PayloadAction<string>) => { - state.token = action.payload + setToken: (state, action: PayloadAction<{ token: string, username: string }>) => { + state.token = action.payload.token; + state.username = action.payload.username }, + setUser: (state, action: PayloadAction<RbacUser>) => { state.user = action.payload }, }, }) export const { setToken } = userSlice.actions +export const { setUser } = userSlice.actions export default userSlice.reducer export const userReducerPath = userSlice.reducerPath; @@ -32,18 +38,31 @@ export const userReducerPath = userSlice.reducerPath; startListening({ - actionCreator: setToken, + predicate: (action, { user }: any) => { + return setToken.match(action) && !!user.token; + }, + + effect: async (_, listenerApi) => { + const payload: UserServiceGetUsersApiArg = {}; + + listenerApi.dispatch(api.endpoints.userServiceGetUsers.initiate(payload)).then((response) => { + if (response.error || !response.data?.user?.length) { + // TODO proper error handling + throw new Error('Fetching the pnd list after successful login failed'); + } + + const {user} = listenerApi.getState() as RootState; + + // TODO ask if this is the correct approach + const matchedUser = response.data.user.find((_user) => _user.name === user.username); - effect: async (action, listenerApi) => { + if (!matchedUser) { + // TODO proper error handling + throw new Error('No user found with the provided username'); + } - // const payload: AuthServiceLoginApiArg = { - // rbacLoginRequest: { - // username: action.payload.username, - // pwd: action.payload.password, - // timestamp: new Date().getTime().toString(), - // }, - // } - // listenerApi.dispatch(api.endpoints.authServiceLogin.initiate(payload)); + listenerApi.dispatch(setUser(matchedUser)); + }); }, }) \ No newline at end of file diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx index c0ef7d1a4..3993a0383 100644 --- a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx @@ -7,10 +7,12 @@ import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Link, Outlet, useNavigate } from "react-router-dom"; import "./protected.layout.scss"; +import { useAppSelector } from '@hooks'; export const ProtectedLayout = () => { const { isAuthenticated, logout } = useAuth(); + const { user } = useAppSelector(state => state.user); const navigate = useNavigate(); const { t } = useTranslation('common') @@ -84,7 +86,8 @@ export const ProtectedLayout = () => { </Dropdown.Toggle> <Dropdown.Menu as={UserIconMenu}> - <Dropdown.Item eventKey="1">matthias.feyll@stud.h-da.de</Dropdown.Item> + <Dropdown.Item eventKey="1">{user?.name}</Dropdown.Item> + <hr /> <Dropdown.Item eventKey="1"> <Link className="text-decoration-none text-reset" to="/">{t('protected.link.settings')}</Link> </Dropdown.Item> diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/utils/provider/auth.provider.tsx index a741ef708..d583d4116 100644 --- a/react-ui/src/utils/provider/auth.provider.tsx +++ b/react-ui/src/utils/provider/auth.provider.tsx @@ -34,10 +34,10 @@ export const AuthProvider = ({ children }) => { useEffect(() => { console.log('auth provider init'); - + if (isAuthenticated()) { navigate('/') - }else { + } else { navigate('/login') } }, []); @@ -72,29 +72,25 @@ export const AuthProvider = ({ children }) => { throw Error("Response is successful but no token was provided. Expected response {token: '<jwt-token>'}"); } - dispatch(setToken(response.token)); + dispatch(setToken({ token: response.token, username })); navigate('/'); }).catch((error) => { // determine whether 500 or 401 err }); } - const login = (username: string, password: string) => { - executeLogin(username, password); - } - const isAuthenticated = () => { if (!token) { return false; } - + const { exp } = jwtDecode(token); const currentTime = new Date().getTime() / 1000; - + // TODO this is currently a workaround for the never expiring token if (process.env.NODE_ENV === 'development') { return !!token; - }else { + } else { return !!token && exp! > currentTime; } } @@ -106,7 +102,7 @@ export const AuthProvider = ({ children }) => { const value = useMemo( () => ({ - login, + login: executeLogin, logout, isAuthenticated, loginProperties -- GitLab From 503df845221425af6a724413feb61cac0c0389bc Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 27 Aug 2024 10:43:13 +0200 Subject: [PATCH 21/78] wip --- react-ui/scripts/modify-api.sh | 32 ++++++++++++++++++++++++++++++++ react-ui/scripts/template.js | 18 ++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100755 react-ui/scripts/modify-api.sh create mode 100644 react-ui/scripts/template.js diff --git a/react-ui/scripts/modify-api.sh b/react-ui/scripts/modify-api.sh new file mode 100755 index 000000000..d5b9fdf5b --- /dev/null +++ b/react-ui/scripts/modify-api.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env sh + +# Verzeichnis mit den generierten Dateien +GENERATED_DIR="../src/utils/api/" + +# Template-Datei +TEMPLATE_FILE="./template.js" + +# Stelle sicher, dass das Template existiert +if [[ ! -f "$TEMPLATE_FILE" ]]; then + echo "Template file not found: $TEMPLATE_FILE" + exit 1 +fi + +# Füge den Inhalt des Templates in jede Query-Funktion ein +for file in "$GENERATED_DIR"/*.ts; do + if grep -q 'builder.query' "$file"; then + echo "Processing $file..." + + # Überprüfen, ob onCacheEntryAdded bereits vorhanden ist + if ! grep -q 'onCacheEntryAdded' "$file"; then + # Füge das Template in die Query-Funktion ein + sed -i.bak '/builder.query.*{/r '"$TEMPLATE_FILE" "$file" + + echo "Extended $file with onCacheEntryAdded." + else + echo "$file already contains onCacheEntryAdded, skipping." + fi + fi +done + +echo "All applicable files processed." \ No newline at end of file diff --git a/react-ui/scripts/template.js b/react-ui/scripts/template.js new file mode 100644 index 000000000..2fa7b2993 --- /dev/null +++ b/react-ui/scripts/template.js @@ -0,0 +1,18 @@ +onCacheEntryAdded: async (arg, { updateCachedData, cacheDataLoaded, cacheEntryRemoved }) => { + try { + // Warte, bis der Cache geladen ist + await cacheDataLoaded; + + // Beobachte kontinuierlich Änderungen am Cache + const unsubscribe = updateCachedData((draft) => { + console.log('Updated data:', draft); + // Hier kannst du auf die Daten zugreifen und z.B. weitere Aktionen auslösen + }); + + // Aufräumen, wenn der Cache entfernt wird + await cacheEntryRemoved; + unsubscribe(); + } catch (err) { + console.error('Error in onCacheEntryAdded:', err); + } + }, \ No newline at end of file -- GitLab From f2e9631228dbf35137294f5d2ee9b77315971aa2 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 27 Aug 2024 10:43:23 +0200 Subject: [PATCH 22/78] (fix) fix race conidtion on login | refetching persist in store now --- react-ui/scripts/modify-api.sh | 32 -------- react-ui/scripts/template.js | 18 ----- .../landingpage.scss => device/device.scss} | 0 .../components/view/device/device.view.tsx | 50 +++++++++++++ .../view/landingpage/landingpage.tsx | 11 --- .../src/components/view/login/login.view.tsx | 4 +- .../src/components/view/splash/splash.view.ts | 0 .../components/view_model/device.viewmodel.ts | 48 ++++++++++++ .../components/view_model/login.viewmodel.ts | 1 - react-ui/src/index.tsx | 29 +------- react-ui/src/routes.tsx | 16 ++++ react-ui/src/stores/api.store.ts | 8 +- react-ui/src/stores/persist.store.ts | 2 + react-ui/src/stores/reducer/device.reducer.ts | 74 +++++++++++++++++++ .../src/stores/reducer/schedule.reducer.ts | 50 +++++++------ react-ui/src/stores/reducer/user.reducer.ts | 57 +++++++------- react-ui/src/utils/helper/coookie.ts | 14 ++++ .../{auth.layout.tsx => basic.layout.tsx} | 9 +-- react-ui/src/utils/layouts/login.layout.tsx | 4 +- .../protected.layout/protected.layout.scss | 8 +- .../protected.layout/protected.layout.tsx | 14 ++-- react-ui/src/utils/provider/auth.provider.tsx | 16 ++-- .../src/utils/provider/fetch.provider.tsx | 21 ------ react-ui/src/utils/scheduler.tsx | 20 ----- react-ui/tsconfig.json | 4 +- react-ui/tsconfig.node.json | 2 +- react-ui/vite.config.mjs | 2 + 27 files changed, 302 insertions(+), 212 deletions(-) delete mode 100755 react-ui/scripts/modify-api.sh delete mode 100644 react-ui/scripts/template.js rename react-ui/src/components/view/{landingpage/landingpage.scss => device/device.scss} (100%) create mode 100644 react-ui/src/components/view/device/device.view.tsx delete mode 100644 react-ui/src/components/view/landingpage/landingpage.tsx delete mode 100644 react-ui/src/components/view/splash/splash.view.ts create mode 100644 react-ui/src/components/view_model/device.viewmodel.ts create mode 100644 react-ui/src/routes.tsx create mode 100644 react-ui/src/stores/reducer/device.reducer.ts create mode 100644 react-ui/src/utils/helper/coookie.ts rename react-ui/src/utils/layouts/{auth.layout.tsx => basic.layout.tsx} (52%) delete mode 100644 react-ui/src/utils/provider/fetch.provider.tsx delete mode 100644 react-ui/src/utils/scheduler.tsx diff --git a/react-ui/scripts/modify-api.sh b/react-ui/scripts/modify-api.sh deleted file mode 100755 index d5b9fdf5b..000000000 --- a/react-ui/scripts/modify-api.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env sh - -# Verzeichnis mit den generierten Dateien -GENERATED_DIR="../src/utils/api/" - -# Template-Datei -TEMPLATE_FILE="./template.js" - -# Stelle sicher, dass das Template existiert -if [[ ! -f "$TEMPLATE_FILE" ]]; then - echo "Template file not found: $TEMPLATE_FILE" - exit 1 -fi - -# Füge den Inhalt des Templates in jede Query-Funktion ein -for file in "$GENERATED_DIR"/*.ts; do - if grep -q 'builder.query' "$file"; then - echo "Processing $file..." - - # Überprüfen, ob onCacheEntryAdded bereits vorhanden ist - if ! grep -q 'onCacheEntryAdded' "$file"; then - # Füge das Template in die Query-Funktion ein - sed -i.bak '/builder.query.*{/r '"$TEMPLATE_FILE" "$file" - - echo "Extended $file with onCacheEntryAdded." - else - echo "$file already contains onCacheEntryAdded, skipping." - fi - fi -done - -echo "All applicable files processed." \ No newline at end of file diff --git a/react-ui/scripts/template.js b/react-ui/scripts/template.js deleted file mode 100644 index 2fa7b2993..000000000 --- a/react-ui/scripts/template.js +++ /dev/null @@ -1,18 +0,0 @@ -onCacheEntryAdded: async (arg, { updateCachedData, cacheDataLoaded, cacheEntryRemoved }) => { - try { - // Warte, bis der Cache geladen ist - await cacheDataLoaded; - - // Beobachte kontinuierlich Änderungen am Cache - const unsubscribe = updateCachedData((draft) => { - console.log('Updated data:', draft); - // Hier kannst du auf die Daten zugreifen und z.B. weitere Aktionen auslösen - }); - - // Aufräumen, wenn der Cache entfernt wird - await cacheEntryRemoved; - unsubscribe(); - } catch (err) { - console.error('Error in onCacheEntryAdded:', err); - } - }, \ No newline at end of file diff --git a/react-ui/src/components/view/landingpage/landingpage.scss b/react-ui/src/components/view/device/device.scss similarity index 100% rename from react-ui/src/components/view/landingpage/landingpage.scss rename to react-ui/src/components/view/device/device.scss diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/view/device/device.view.tsx new file mode 100644 index 000000000..8a664c4d8 --- /dev/null +++ b/react-ui/src/components/view/device/device.view.tsx @@ -0,0 +1,50 @@ +import { useAppSelector } from '@hooks'; +import { Col, Container, Row, Table } from 'react-bootstrap'; +import './device.scss'; +import { useDeviceViewModel } from '@viewmodel/device.viewmodel'; + +function DeviceView() { + const { devices } = useAppSelector(state => state.device); + useDeviceViewModel(); + + + const getDeviceTable = () => { + return devices.map((device, index) => ( + <tr key={index}> + <td>{device.name}</td> + <td>{device.id}</td> + <td>{device.pid}</td> + </tr> + )) + } + + return ( + <div className='m-4 pt-4'> + <Container className="bg-white rounded c-box"> + <Row > + <Col><h3>Device list</h3></Col> + </Row> + + <Row className='mt-2'> + <Col> + <Table striped bordered hover className='table-primary'> + <thead> + <tr> + <th>Name</th> + <th>UUID</th> + <th>User</th> + <th>Last updated</th> + </tr> + </thead> + <tbody> + {getDeviceTable()} + </tbody> + </Table> + </Col> + </Row> + </Container> + </div> + ) +} + +export default DeviceView diff --git a/react-ui/src/components/view/landingpage/landingpage.tsx b/react-ui/src/components/view/landingpage/landingpage.tsx deleted file mode 100644 index 62c358639..000000000 --- a/react-ui/src/components/view/landingpage/landingpage.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import './landingpage.scss' - -function Landingpage() { - return ( - <div className="App"> - - </div> - ) -} - -export default Landingpage diff --git a/react-ui/src/components/view/login/login.view.tsx b/react-ui/src/components/view/login/login.view.tsx index ba8da826e..405a42f84 100644 --- a/react-ui/src/components/view/login/login.view.tsx +++ b/react-ui/src/components/view/login/login.view.tsx @@ -6,7 +6,7 @@ import logo from '@assets/logo.svg' import useLoginViewModel from '@viewmodel/login.viewmodel' import React, { useRef } from 'react' -const LoginPage = ({ children }) => { +const LoginView = ({ children }) => { const { t } = useTranslation('common') const { login, handleErrorMessageRendering, displayFormFieldChecks, loginLoading } = useLoginViewModel(); @@ -82,4 +82,4 @@ const LoginPage = ({ children }) => { ) } -export default LoginPage +export default LoginView diff --git a/react-ui/src/components/view/splash/splash.view.ts b/react-ui/src/components/view/splash/splash.view.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/react-ui/src/components/view_model/device.viewmodel.ts b/react-ui/src/components/view_model/device.viewmodel.ts new file mode 100644 index 000000000..7ceb78809 --- /dev/null +++ b/react-ui/src/components/view_model/device.viewmodel.ts @@ -0,0 +1,48 @@ +import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementGetAllFlattenedResponse, NetworkElementServiceGetAllFlattenedApiArg } from "@api/api"; +import { useAppSelector } from "@hooks"; +import { setDevices } from "@reducer/device.reducer"; +import { QueryActionCreatorResult } from "@reduxjs/toolkit/query"; +import { useEffect } from "react"; +import { useDispatch } from "react-redux"; +import { AppDispatch } from "src/stores"; + +const FETCH_DEVICES_INTERVAL = 15000; // in ms + + +export const useDeviceViewModel = () => { + const { user } = useAppSelector(state => state.user); + const [triggerFetchDevices] = api.endpoints.networkElementServiceGetAllFlattened.useLazyQuerySubscription({ + pollingInterval: FETCH_DEVICES_INTERVAL, + skipPollingIfUnfocused: true + }); + const dispatch = useDispatch<AppDispatch>(); + + + // TODO figure out how we get the proper response type here + let fetchDevicesSubscription: QueryActionCreatorResult<any> | undefined; + + + useEffect(() => { + fetchDevices(); + + return () => { + fetchDevicesSubscription?.unsubscribe(); + } + }, []) + + const fetchDevices = () => { + const payload: NetworkElementServiceGetAllFlattenedApiArg = { + pid: Object.keys(user?.roles)[0], + timestamp: new Date().getTime().toString(), + } + + fetchDevicesSubscription = triggerFetchDevices(payload); + fetchDevicesSubscription.then((response) => { + const { mne } = response.data as NetworkelementGetAllFlattenedResponse; + dispatch(setDevices(mne)); + }); + } + + return { + } +} \ No newline at end of file diff --git a/react-ui/src/components/view_model/login.viewmodel.ts b/react-ui/src/components/view_model/login.viewmodel.ts index 93f4c33f2..370834a0c 100644 --- a/react-ui/src/components/view_model/login.viewmodel.ts +++ b/react-ui/src/components/view_model/login.viewmodel.ts @@ -9,7 +9,6 @@ export interface PageLoginState { export default function useLoginViewModel() { const {login, loginProperties} = useAuth(); const {isLoading: loginLoading, error: loginError, reset: resetLogin} = loginProperties!; - const [localFormState, updateLocalFormState] = useState({ submitted: false, diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 50f9c3509..3eb8a604f 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,48 +1,27 @@ import React from 'react' import ReactDOM, { Container } from 'react-dom/client' import { - Route, - RouterProvider, - createBrowserRouter, - createRoutesFromElements + RouterProvider } from 'react-router-dom' -import Landingpage from './components/view/landingpage/landingpage' import './index.scss' -import { BasicLayout } from '@layout/auth.layout' -import { LoginLayout } from '@layout/login.layout' -import { ProtectedLayout } from '@layout/protected.layout/protected.layout' import i18next from 'i18next' import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' import { ToastContainer } from 'react-toastify' import { PersistGate } from 'redux-persist/integration/react' import './i18n/config' +import { router } from './routes' import { persistor, store } from './stores' import './utils/icons/icons' - -const root = ReactDOM.createRoot(document.getElementById('root') as Container) - -// create a proper routing -const router = createBrowserRouter( - createRoutesFromElements( - <Route element={<BasicLayout />}> - <Route path="/login" element={<LoginLayout />} /> - <Route element={<ProtectedLayout />}> - <Route path="/" element={<Landingpage />} /> - </Route> - </Route> - ) -) - const installToastify = () => { return ( <ToastContainer /> ) } -root.render( +ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> <Provider store={store}> <PersistGate loading={null} persistor={persistor}> @@ -53,4 +32,4 @@ root.render( </PersistGate> </Provider> </React.StrictMode> -) +); \ No newline at end of file diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx new file mode 100644 index 000000000..28a06cbfb --- /dev/null +++ b/react-ui/src/routes.tsx @@ -0,0 +1,16 @@ +import { BasicLayout } from "@layout/basic.layout" +import { LoginLayout } from "@layout/login.layout" +import { ProtectedLayout } from "@layout/protected.layout/protected.layout" +import DeviceView from "@view/device/device.view" +import { createBrowserRouter, createRoutesFromElements, Route } from "react-router-dom" + +export const router = createBrowserRouter( + createRoutesFromElements( + <Route element={<BasicLayout />}> + <Route path="/login" element={<LoginLayout />} /> + <Route element={<ProtectedLayout />}> + <Route path="/" element={<DeviceView />} /> + </Route> + </Route> + ) +) \ No newline at end of file diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index bd36b8227..fd894e97b 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -1,11 +1,11 @@ -import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' -import { RootState } from '.' +import { getCookieValue } from '@helper/coookie'; +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; // initialize an empty api service that we'll inject endpoints into later as needed export const emptySplitApi = createApi({ baseQuery: fetchBaseQuery({ - baseUrl: '/api', prepareHeaders: (headers, { getState }) => { - const token = (getState() as RootState).user.token + baseUrl: '/api', prepareHeaders: (headers) => { + const token = getCookieValue('token'); if (token) { headers.set('authorize', `${token}`) diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index 806b6e2e1..feb5241a8 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -4,6 +4,7 @@ import { persistReducer } from "redux-persist"; import storage from "redux-persist/es/storage"; import { emptySplitApi } from "./api.store"; import scheduleReducer from "@reducer/schedule.reducer"; +import deviceReducer from "@reducer/device.reducer"; /** local storage config */ @@ -16,6 +17,7 @@ const rootPersistConfig = { const rootReducer = combineReducers({ user: userReducer, + device: deviceReducer, scheduler: scheduleReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/src/stores/reducer/device.reducer.ts b/react-ui/src/stores/reducer/device.reducer.ts new file mode 100644 index 000000000..ec47ff1f8 --- /dev/null +++ b/react-ui/src/stores/reducer/device.reducer.ts @@ -0,0 +1,74 @@ +import { api, NetworkelementFlattenedManagedNetworkElement, NetworkElementServiceGetAllFlattenedApiArg } from '@api/api'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; +import { RootState } from '..'; +import { startListening } from '../middleware/listener.middleware'; +import { setUser } from './user.reducer'; + +type Device = NetworkelementFlattenedManagedNetworkElement; + + +export interface DeviceSliceState { + devices: Device[], +} + +const initialState: DeviceSliceState = { + devices: [], +} + + + + +const deviceSlice = createSlice({ + name: 'device', + initialState, + reducers: { + setDevices: (state, action: PayloadAction<Device[]>) => { state.devices = action.payload }, + }, +}) + +export const { setDevices } = deviceSlice.actions + +export default deviceSlice.reducer +export const deviceReducerPath = deviceSlice.reducerPath; + + + +let fetchSubscription: QueryActionCreatorResult<any>[] = []; +export const abortFetching = () => { + fetchSubscription.forEach((subscription) => { + subscription.unsubscribe(); + }); + fetchSubscription = []; +} + +// continously fetch devices +const FETCH_DEVICES_INTERVAL = 5000; // in ms +startListening({ + actionCreator: setUser, + effect: async (_, listenerApi) => { + const { user } = listenerApi.getState() as RootState; + + const payload: NetworkElementServiceGetAllFlattenedApiArg = { + pid: Object.keys(user?.user.roles)[0], + timestamp: new Date().getTime().toString(), + } + + const subscription = listenerApi.dispatch(api.endpoints.networkElementServiceGetAllFlattened.initiate(payload, { + subscriptionOptions: { + pollingInterval: FETCH_DEVICES_INTERVAL, + skipPollingIfUnfocused: true, + } + })); + + fetchSubscription = [...fetchSubscription, subscription]; + }, +}) + +// save fetched devices +startListening({ + predicate: (action) => api.endpoints.networkElementServiceGetAllFlattened.matchFulfilled(action), + effect: async (action, listenerApi) => { + listenerApi.dispatch(setDevices(action.payload.mne)); + }, +}) \ No newline at end of file diff --git a/react-ui/src/stores/reducer/schedule.reducer.ts b/react-ui/src/stores/reducer/schedule.reducer.ts index 345b26bf2..2e2bbe36b 100644 --- a/react-ui/src/stores/reducer/schedule.reducer.ts +++ b/react-ui/src/stores/reducer/schedule.reducer.ts @@ -3,18 +3,21 @@ import { startListening } from '../middleware/listener.middleware'; export enum ScheduleState { INIT, RUNNING, STOPPED } -type Task<T> = (options: T) => void; - -interface Schedule<T> { - f: Task<T>, +export type Task = { + job: (options: object) => void, interval: number, + type: string +}; + +interface Schedule { + task: Task, id: number, state: ScheduleState, intervalId: NodeJS.Timeout | undefined } export interface ScheduleReducerState { - schedules: Schedule<any>[] + schedules: Schedule[] } const initialState: ScheduleReducerState = { @@ -25,10 +28,9 @@ const ScheduleSlice = createSlice({ name: 'schedule', initialState, reducers: { - addSchedule: (state, action: PayloadAction<{ task: Task<any>, interval: number }>) => { + registerTask: (state, action: PayloadAction<Task>) => { const newSchedule = { - f: action.payload.task, - interval: action.payload.interval, + task: action.payload.task, id: state.schedules.length, state: ScheduleState.INIT, intervalId: undefined @@ -36,9 +38,9 @@ const ScheduleSlice = createSlice({ state.schedules = [...state.schedules, newSchedule] }, - startSchedule: (state, action: PayloadAction<Schedule<any>>) => { + startSchedule: (state, action: PayloadAction<Schedule>) => { const schedule = action.payload; - schedule.intervalId = setInterval(schedule.f, schedule.interval); + schedule.intervalId = setInterval(schedule.task.job, schedule.task.interval); schedule.state = ScheduleState.RUNNING; state.schedules[schedule.id] = schedule; @@ -46,25 +48,25 @@ const ScheduleSlice = createSlice({ }, }) -export const { addSchedule } = ScheduleSlice.actions +export const { registerTask } = ScheduleSlice.actions export const { startSchedule } = ScheduleSlice.actions export default ScheduleSlice.reducer -startListening({ - actionCreator: addSchedule, +// startListening({ +// actionCreator: addSchedule, - effect: (action, listenerApi) => { - const newState = listenerApi.getState() as ScheduleReducerState; - const originalState = listenerApi.getOriginalState() as ScheduleReducerState; +// effect: (action, listenerApi) => { +// const newState = listenerApi.getState() as ScheduleReducerState; +// const originalState = listenerApi.getOriginalState() as ScheduleReducerState; - // get the added schedule - const schedule = newState.schedules.filter(s => !originalState.schedules.includes(s)).at(0); - if (!schedule) { - throw new Error("Added schedule not found in store"); - } +// // get the added schedule +// const schedule = newState.schedules.filter(s => !originalState.schedules.includes(s)).at(0); +// if (!schedule) { +// throw new Error("Added schedule not found in store"); +// } - listenerApi.dispatch(startSchedule(schedule)) - }, -}) \ No newline at end of file +// listenerApi.dispatch(startSchedule(schedule)) +// }, +// }) \ No newline at end of file diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/stores/reducer/user.reducer.ts index b1d5f99cd..797626db0 100644 --- a/react-ui/src/stores/reducer/user.reducer.ts +++ b/react-ui/src/stores/reducer/user.reducer.ts @@ -1,10 +1,10 @@ import { api, RbacUser, UserServiceGetUsersApiArg } from '@api/api'; -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { startListening } from '../middleware/listener.middleware'; +import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '..'; +import { startListening } from '../middleware/listener.middleware'; +import { getCookieValue, setCookieValue } from '@helper/coookie'; export interface UserSliceState { - token: string, // defined by the frontend user input. This value is getting compared with the backend response username: string, user: RbacUser | null, @@ -12,7 +12,6 @@ export interface UserSliceState { const initialState: UserSliceState = { - token: '', username: '', user: null, } @@ -22,8 +21,10 @@ const userSlice = createSlice({ initialState, reducers: { setToken: (state, action: PayloadAction<{ token: string, username: string }>) => { - state.token = action.payload.token; - state.username = action.payload.username + const token = action.payload?.token || ''; + setCookieValue('token', token); + + state.username = action.payload?.username || '' }, setUser: (state, action: PayloadAction<RbacUser>) => { state.user = action.payload }, }, @@ -36,33 +37,27 @@ export default userSlice.reducer export const userReducerPath = userSlice.reducerPath; +export const fetchUser = createAsyncThunk( + 'user/fetchUser', + (_, thunkAPI) => { + const payload: UserServiceGetUsersApiArg = {}; -startListening({ - predicate: (action, { user }: any) => { - return setToken.match(action) && !!user.token; - }, - - effect: async (_, listenerApi) => { - const payload: UserServiceGetUsersApiArg = {}; + thunkAPI.dispatch(api.endpoints.userServiceGetUsers.initiate(payload)).then((response) => { + if (response.error || !response.data?.user?.length) { + // TODO proper error handling + throw new Error('Fetching the pnd list after successful login failed'); + } - listenerApi.dispatch(api.endpoints.userServiceGetUsers.initiate(payload)).then((response) => { - if (response.error || !response.data?.user?.length) { - // TODO proper error handling - throw new Error('Fetching the pnd list after successful login failed'); - } + const { user } = thunkAPI.getState() as RootState; - const {user} = listenerApi.getState() as RootState; + // TODO ask if this is the correct approach + const matchedUser = response.data.user.find((_user) => _user.name === user.username); - // TODO ask if this is the correct approach - const matchedUser = response.data.user.find((_user) => _user.name === user.username); + if (!matchedUser) { + // TODO proper error handling + throw new Error('No user found with the provided username'); + } - if (!matchedUser) { - // TODO proper error handling - throw new Error('No user found with the provided username'); - } - - - listenerApi.dispatch(setUser(matchedUser)); - }); - }, -}) \ No newline at end of file + thunkAPI.dispatch(setUser(matchedUser)); + }); +}); \ No newline at end of file diff --git a/react-ui/src/utils/helper/coookie.ts b/react-ui/src/utils/helper/coookie.ts new file mode 100644 index 000000000..75cba2dc8 --- /dev/null +++ b/react-ui/src/utils/helper/coookie.ts @@ -0,0 +1,14 @@ +export const getCookieValue = (name: string): string => { + const regex = new RegExp(`(^| )${name}=([^;]+)`) + const match = document.cookie.match(regex) + + if (match) { + return match[2]; + } + + return ''; +} + +export const setCookieValue = (key: string, value: string): void => { + document.cookie = `${key}=${value}; Secure; SameSite=Lax`; +} \ No newline at end of file diff --git a/react-ui/src/utils/layouts/auth.layout.tsx b/react-ui/src/utils/layouts/basic.layout.tsx similarity index 52% rename from react-ui/src/utils/layouts/auth.layout.tsx rename to react-ui/src/utils/layouts/basic.layout.tsx index a38da03a9..7b7f2b11c 100644 --- a/react-ui/src/utils/layouts/auth.layout.tsx +++ b/react-ui/src/utils/layouts/basic.layout.tsx @@ -1,19 +1,14 @@ import { AuthProvider } from "@provider/auth.provider"; -import { useEffect } from "react"; import { useOutlet } from "react-router-dom"; -import { ScheduleProvider } from "../scheduler"; export const BasicLayout = () => { const outlet = useOutlet(); - const { initSchedules } = ScheduleProvider(); - useEffect(() => { - initSchedules(); - }, []) + return ( <AuthProvider> - {outlet} + {outlet} </AuthProvider> ) } \ No newline at end of file diff --git a/react-ui/src/utils/layouts/login.layout.tsx b/react-ui/src/utils/layouts/login.layout.tsx index 08a875f75..43e40aa30 100644 --- a/react-ui/src/utils/layouts/login.layout.tsx +++ b/react-ui/src/utils/layouts/login.layout.tsx @@ -1,5 +1,5 @@ import { useAuth } from "@provider/auth.provider"; -import LoginPage from "@view/login/login.view"; +import LoginView from "@view/login/login.view"; import { useEffect } from "react"; import { useNavigate, useOutlet } from "react-router-dom"; @@ -18,6 +18,6 @@ export const LoginLayout = ({ children }) => { }, []); return ( - <LoginPage>{outlet}</LoginPage> + <LoginView>{outlet}</LoginView> ) } \ No newline at end of file diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.scss b/react-ui/src/utils/layouts/protected.layout/protected.layout.scss index eb713fa7a..47561615d 100644 --- a/react-ui/src/utils/layouts/protected.layout/protected.layout.scss +++ b/react-ui/src/utils/layouts/protected.layout/protected.layout.scss @@ -1,5 +1,7 @@ @import "/src/style/colors.scss"; +$sidebar-width: 4.5em; + .head-links { text-decoration: none; color: map-get($theme-colors, dark); @@ -18,6 +20,10 @@ } .sidebar { - width: 4.5em; + width: $sidebar-width; height: 100vh; } + +.main-content { + margin-left: $sidebar-width; +} \ No newline at end of file diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx index 3993a0383..834b2ac5f 100644 --- a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx @@ -7,7 +7,8 @@ import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Link, Outlet, useNavigate } from "react-router-dom"; import "./protected.layout.scss"; -import { useAppSelector } from '@hooks'; +import { useAppDispatch, useAppSelector } from '@hooks'; +import { fetchUser } from '@reducer/user.reducer'; export const ProtectedLayout = () => { @@ -15,11 +16,15 @@ export const ProtectedLayout = () => { const { user } = useAppSelector(state => state.user); const navigate = useNavigate(); const { t } = useTranslation('common') + const dispatch = useAppDispatch(); useEffect(() => { if (!isAuthenticated()) { navigate('/login') + return; } + + dispatch(fetchUser()); }, []); /** @@ -27,9 +32,6 @@ export const ProtectedLayout = () => { */ const handleActiveLink = (targetPath: string): string => { const href = window.location.href; - console.log(href); - - return href.includes(targetPath) ? ' active' : ''; } @@ -101,7 +103,9 @@ export const ProtectedLayout = () => { <div> {HorizontalNavbar()} {VerticalSidebar()} - <Outlet /> + <div className='main-content'> + <Outlet /> + </div> </div> ) }; \ No newline at end of file diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/utils/provider/auth.provider.tsx index d583d4116..638d9b408 100644 --- a/react-ui/src/utils/provider/auth.provider.tsx +++ b/react-ui/src/utils/provider/auth.provider.tsx @@ -1,5 +1,7 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; +import { getCookieValue } from "@helper/coookie"; import { useAppDispatch, useAppSelector } from "@hooks"; +import { abortFetching } from "@reducer/device.reducer"; import { setToken } from "@reducer/user.reducer"; import { jwtDecode } from "jwt-decode"; import { createContext, useContext, useEffect, useMemo } from "react"; @@ -30,17 +32,17 @@ const AuthContext = createContext<AuthProviderType>({ export const AuthProvider = ({ children }) => { const dispatch = useAppDispatch();; const navigate = useNavigate(); - const { token } = useAppSelector(state => state.user); + const { username } = useAppSelector(state => state.user); useEffect(() => { - console.log('auth provider init'); - - if (isAuthenticated()) { + const token = getCookieValue('token'); + + if (token) { navigate('/') } else { navigate('/login') } - }, []); + }, [username]); const [ sendLogin, @@ -80,6 +82,7 @@ export const AuthProvider = ({ children }) => { } const isAuthenticated = () => { + const token = getCookieValue('token'); if (!token) { return false; } @@ -96,7 +99,8 @@ export const AuthProvider = ({ children }) => { } const logout = () => { - dispatch(setToken("")); + abortFetching(); + dispatch(setToken(null)); // TODO: purge other information } diff --git a/react-ui/src/utils/provider/fetch.provider.tsx b/react-ui/src/utils/provider/fetch.provider.tsx deleted file mode 100644 index 9db4e121c..000000000 --- a/react-ui/src/utils/provider/fetch.provider.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { useAppSelector } from "@hooks"; -import { useAuth } from "./auth.provider" - - -// seconds before token expire to trigger a refetch -const REFETCH_TOKEN_TIME = 43200; - -const FetchProvider = () => { - const { isAuthenticated: isAuthed } = useAuth(); - const { token } = useAppSelector((root) => root.user); - - - const checkFetch = (): boolean => { - const { exp } = jwtDecode(token); - const currentTime = new Date().getTime() / 1000; - - return exp - } - - return -} \ No newline at end of file diff --git a/react-ui/src/utils/scheduler.tsx b/react-ui/src/utils/scheduler.tsx deleted file mode 100644 index 51bf94de3..000000000 --- a/react-ui/src/utils/scheduler.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { useAppSelector } from "@hooks"; -import { startSchedule } from "@reducer/schedule.reducer"; -import { useDispatch } from "react-redux"; -import { AppDispatch } from "src/stores"; - -export const ScheduleProvider = () => { - const dispatch = useDispatch<AppDispatch>(); - const { schedules } = useAppSelector(state => state.scheduler); - - - const initSchedules = () => { - schedules.forEach(schedule => { - dispatch(startSchedule(schedule)); - }) - } - - return { - initSchedules - } -} diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index b8c8c0625..cc5d30818 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -15,7 +15,7 @@ "jsx": "react-jsx", /* Linting */ - "strict": true, + "strict": false, "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, @@ -30,6 +30,8 @@ "@provider/*": ["src/utils/provider/*"], "@layout/*": ["src/utils/layouts/*"], "@hooks": ["src/hooks"], + "@task/*": ["src/utils/tasks/*"], + "@helper/*": ["src/utils/helper/*"], } }, "include": [ diff --git a/react-ui/tsconfig.node.json b/react-ui/tsconfig.node.json index 9357c44f3..3a29b0309 100644 --- a/react-ui/tsconfig.node.json +++ b/react-ui/tsconfig.node.json @@ -5,7 +5,7 @@ "module": "ES2020", "moduleResolution": "bundler", "allowSyntheticDefaultImports": true, - "strict": true + "strict": false }, "include": [ "vite.config.ts" diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index c52ee47ca..dee436d2a 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -36,6 +36,8 @@ export default defineConfig({ "@provider": "/src/utils/provider", "@layout": "/src/utils/layouts", "@hooks": "/src/hooks.ts", + "@task": "/src/utils/tasks", + "@helper": "/src/utils/helper", }, }, -- GitLab From 061ceb260c0f71a4cbf8fdda43001a471edf4be7 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Fri, 13 Sep 2024 10:59:46 +0200 Subject: [PATCH 23/78] add metadata & yang model tabs --- .../view/device/deivce.view.tabs.tsx | 28 +++++++ .../src/components/view/device/device.scss | 13 ++++ .../view/device/device.view.table.tsx | 58 +++++++++++++++ .../components/view/device/device.view.tsx | 73 ++++++++++--------- .../view_model/device.table.viewmodel.ts | 29 ++++++++ .../components/view_model/device.viewmodel.ts | 55 ++++---------- .../src/i18n/locales/en/translations.json | 25 ++++++- react-ui/src/routes.tsx | 11 ++- react-ui/src/stores/reducer/device.reducer.ts | 35 ++++++--- react-ui/src/stores/reducer/user.reducer.ts | 3 +- react-ui/src/style/box.scss | 2 +- react-ui/src/style/utils.scss | 2 +- react-ui/src/utils/helper/coookie.ts | 2 +- .../protected.layout/protected.layout.tsx | 7 +- react-ui/src/utils/provider/auth.provider.tsx | 7 +- react-ui/tsconfig.json | 1 + react-ui/vite.config.mjs | 1 + 17 files changed, 256 insertions(+), 96 deletions(-) create mode 100644 react-ui/src/components/view/device/deivce.view.tabs.tsx create mode 100644 react-ui/src/components/view/device/device.view.table.tsx create mode 100644 react-ui/src/components/view_model/device.table.viewmodel.ts diff --git a/react-ui/src/components/view/device/deivce.view.tabs.tsx b/react-ui/src/components/view/device/deivce.view.tabs.tsx new file mode 100644 index 000000000..a49c7616b --- /dev/null +++ b/react-ui/src/components/view/device/deivce.view.tabs.tsx @@ -0,0 +1,28 @@ + +export enum DeviceViewTabValues { + METADATA = 'metadata', + YANGMODEL = 'yang_model' +} + +export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { + + const metadataTab = () => { + return ( + <div>test</div> + ) + } + + const yangModelTab = () => { + return ( + <div>asdf</div> + ) + } + + + return ( + <> + {(activeTab === DeviceViewTabValues.METADATA) && metadataTab()} + {(activeTab === DeviceViewTabValues.YANGMODEL) && yangModelTab()} + </> + ); +} diff --git a/react-ui/src/components/view/device/device.scss b/react-ui/src/components/view/device/device.scss index e69de29bb..826b7c293 100644 --- a/react-ui/src/components/view/device/device.scss +++ b/react-ui/src/components/view/device/device.scss @@ -0,0 +1,13 @@ +@import '../../../style/colors.scss'; + +thead { + font-size: 0.9em; +} + +tr:hover > td { + background-color: lighten(map-get($theme-colors, primary), 30%) !important; +} + +tr:nth-child(2n+1) > td { + background-color: lighten(map-get($theme-colors, primary) , 38%) +} \ No newline at end of file diff --git a/react-ui/src/components/view/device/device.view.table.tsx b/react-ui/src/components/view/device/device.view.table.tsx new file mode 100644 index 000000000..e2e6c4db5 --- /dev/null +++ b/react-ui/src/components/view/device/device.view.table.tsx @@ -0,0 +1,58 @@ +import { useAppSelector } from "@hooks"; +import { useDeviceTableViewModel } from "@viewmodel/device.table.viewmodel"; +import { MutableRefObject, useCallback } from "react"; +import { OverlayTrigger, Table, Tooltip } from "react-bootstrap"; +import { useTranslation } from "react-i18next"; + +export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { + const { devices, pnds } = useAppSelector(state => state.device); + const { t } = useTranslation('common'); + const { searchTerm } = useDeviceTableViewModel(searchRef); + + const cropUUID = (uuid: string): string => { + return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); + } + + const getDeviceTable = useCallback(() => { + return devices.filter((device) => { + if (!searchRef.current?.value) { + return true; + } + + const searchInput = searchRef.current!.value; + const user = pnds.find(pnd => pnd.id === device.pid); + + return device.id.includes(searchInput) || device.name.includes(searchInput) || user?.name.includes(searchInput); + }).map((device, index) => { + const user = pnds.find(pnd => pnd.id === device.pid); + + return ( + <tr key={index}> + <td>{device.name}</td> + <OverlayTrigger overlay={<Tooltip id={device.id}>{device.id}</Tooltip>}> + <td>{cropUUID(device.id)}</td> + </OverlayTrigger> + <td>{user?.name || ''}</td> + <td></td> + </tr> + ) + }) + }, [searchTerm, devices, pnds]); + + + return ( + <Table striped responsive> + <thead> + <tr> + <th>{t('device.table.header.name')}</th> + <th>{t('device.table.header.uuid')}</th> + <th>{t('device.table.header.user')}</th> + <th>{t('device.table.header.last_updated')}</th> + </tr> + </thead> + <tbody> + {getDeviceTable()} + </tbody> + </Table> + ) +} \ No newline at end of file diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/view/device/device.view.tsx index 8a664c4d8..64a5cb93f 100644 --- a/react-ui/src/components/view/device/device.view.tsx +++ b/react-ui/src/components/view/device/device.view.tsx @@ -1,45 +1,52 @@ -import { useAppSelector } from '@hooks'; -import { Col, Container, Row, Table } from 'react-bootstrap'; -import './device.scss'; import { useDeviceViewModel } from '@viewmodel/device.viewmodel'; +import { useRef } from 'react'; +import { Button, Col, Container, FloatingLabel, Form, Nav, NavLink, Row } from 'react-bootstrap'; +import { useTranslation } from 'react-i18next'; +import { DeviceViewTabs, DeviceViewTabValues } from './deivce.view.tabs'; +import './device.scss'; +import { DeviceViewTable } from './device.view.table'; +import { useParams } from 'react-router-dom'; function DeviceView() { - const { devices } = useAppSelector(state => state.device); - useDeviceViewModel(); - - - const getDeviceTable = () => { - return devices.map((device, index) => ( - <tr key={index}> - <td>{device.name}</td> - <td>{device.id}</td> - <td>{device.pid}</td> - </tr> - )) - } + const { t } = useTranslation('common'); + const searchRef = useRef<HTMLInputElement>(null); + const { activeTab, setActiveTab, handleActiveTabLink } = useDeviceViewModel(); return ( <div className='m-4 pt-4'> - <Container className="bg-white rounded c-box"> - <Row > - <Col><h3>Device list</h3></Col> + <Container className="bg-white rounded c-box" fluid> + <Row className='my-2'> + <Col sm={7}><h3 className='text-black-50'>{t('device.title')}</h3></Col> + <Col sm={5}> + <Nav className='justify-content-around'> + <NavLink className={handleActiveTabLink(DeviceViewTabValues.METADATA)} onClick={() => setActiveTab(DeviceViewTabValues.METADATA)}>{t('device.tabs.metadata.title')}</NavLink> + <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL)} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> + </Nav> + </Col> + + </Row> + + <Row> + <Col sm={3}> + <FloatingLabel + controlId="device.search" + label={t('device.search.placeholder')} + className='p-0 mx-2' + > + <Form.Control type="text" placeholder="name@example.com" ref={searchRef} /> + </FloatingLabel> + </Col> + <Col sm={{ span: 2, offset: 2 }}> + <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> + </Col> </Row> <Row className='mt-2'> - <Col> - <Table striped bordered hover className='table-primary'> - <thead> - <tr> - <th>Name</th> - <th>UUID</th> - <th>User</th> - <th>Last updated</th> - </tr> - </thead> - <tbody> - {getDeviceTable()} - </tbody> - </Table> + <Col sm={7}> + {DeviceViewTable(searchRef)} + </Col> + <Col sm={5} className='border-left border-primary'> + {DeviceViewTabs(activeTab)} </Col> </Row> </Container> diff --git a/react-ui/src/components/view_model/device.table.viewmodel.ts b/react-ui/src/components/view_model/device.table.viewmodel.ts new file mode 100644 index 000000000..224904699 --- /dev/null +++ b/react-ui/src/components/view_model/device.table.viewmodel.ts @@ -0,0 +1,29 @@ +import { useEffect, useState } from "react"; + +export const useDeviceTableViewModel = (searchRef) => { + const [searchTerm, setSearchTerm] = useState(''); + + useEffect(() => { + const handleSearchChange = () => { + if (searchRef.current) { + setSearchTerm(searchRef.current.value); + } + }; + + if (searchRef.current) { + searchRef.current.addEventListener('input', handleSearchChange); + } + + return () => { + if (searchRef.current) { + searchRef.current.removeEventListener('input', handleSearchChange); + } + }; + }, []); + + + + return { + searchTerm + } +} \ No newline at end of file diff --git a/react-ui/src/components/view_model/device.viewmodel.ts b/react-ui/src/components/view_model/device.viewmodel.ts index 7ceb78809..b7b46cd6a 100644 --- a/react-ui/src/components/view_model/device.viewmodel.ts +++ b/react-ui/src/components/view_model/device.viewmodel.ts @@ -1,48 +1,23 @@ -import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementGetAllFlattenedResponse, NetworkElementServiceGetAllFlattenedApiArg } from "@api/api"; -import { useAppSelector } from "@hooks"; -import { setDevices } from "@reducer/device.reducer"; -import { QueryActionCreatorResult } from "@reduxjs/toolkit/query"; -import { useEffect } from "react"; -import { useDispatch } from "react-redux"; -import { AppDispatch } from "src/stores"; - -const FETCH_DEVICES_INTERVAL = 15000; // in ms - +import { useAppDispatch, useAppSelector } from "@hooks"; +import { setActiveTab as setActiveTabState } from "@reducer/device.reducer"; +import { DeviceViewTabValues } from "@view/device/deivce.view.tabs"; export const useDeviceViewModel = () => { - const { user } = useAppSelector(state => state.user); - const [triggerFetchDevices] = api.endpoints.networkElementServiceGetAllFlattened.useLazyQuerySubscription({ - pollingInterval: FETCH_DEVICES_INTERVAL, - skipPollingIfUnfocused: true - }); - const dispatch = useDispatch<AppDispatch>(); - - - // TODO figure out how we get the proper response type here - let fetchDevicesSubscription: QueryActionCreatorResult<any> | undefined; - - - useEffect(() => { - fetchDevices(); - - return () => { - fetchDevicesSubscription?.unsubscribe(); - } - }, []) - - const fetchDevices = () => { - const payload: NetworkElementServiceGetAllFlattenedApiArg = { - pid: Object.keys(user?.roles)[0], - timestamp: new Date().getTime().toString(), - } + const {activeTab} = useAppSelector(state => state.device); + const dispatch = useAppDispatch(); + + const handleActiveTabLink = (tabLink: DeviceViewTabValues) => { + return activeTab === tabLink ? 'active' : ''; + } - fetchDevicesSubscription = triggerFetchDevices(payload); - fetchDevicesSubscription.then((response) => { - const { mne } = response.data as NetworkelementGetAllFlattenedResponse; - dispatch(setDevices(mne)); - }); + const setActiveTab = (tab: DeviceViewTabValues) => { + dispatch(setActiveTabState(tab)); } + return { + activeTab, + setActiveTab, + handleActiveTabLink } } \ No newline at end of file diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index d46896a8c..b58b299b1 100644 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -18,10 +18,33 @@ } } }, + "device": { + "title": "Device list", + "table": { + "header": { + "name": "Name", + "uuid": "UUID", + "user": "User", + "last_updated": "Last updated" + } + }, + "search": { + "placeholder": "Search" + }, + "add_device_button": "Add device", + "tabs": { + "metadata": { + "title": "Metadata" + }, + "yang_model": { + "title": "YANG Model" + } + } + }, "protected": { "link": { "device_list": "Device List", - "map": "Map", + "map": "Map", "configuration_mgmt": "Configuration Management", "settings": "Settings" } diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx index 28a06cbfb..b273246d9 100644 --- a/react-ui/src/routes.tsx +++ b/react-ui/src/routes.tsx @@ -2,14 +2,19 @@ import { BasicLayout } from "@layout/basic.layout" import { LoginLayout } from "@layout/login.layout" import { ProtectedLayout } from "@layout/protected.layout/protected.layout" import DeviceView from "@view/device/device.view" -import { createBrowserRouter, createRoutesFromElements, Route } from "react-router-dom" +import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom" + +export const DEVICE_URL = '/device/'; +export const LOGIN_URL = '/login'; + export const router = createBrowserRouter( createRoutesFromElements( <Route element={<BasicLayout />}> - <Route path="/login" element={<LoginLayout />} /> + <Route path={LOGIN_URL} element={<LoginLayout />} /> <Route element={<ProtectedLayout />}> - <Route path="/" element={<DeviceView />} /> + <Route path={DEVICE_URL} element={<DeviceView />} /> + <Route path="/" element={<Navigate to={DEVICE_URL} replace={true} />} /> </Route> </Route> ) diff --git a/react-ui/src/stores/reducer/device.reducer.ts b/react-ui/src/stores/reducer/device.reducer.ts index ec47ff1f8..3252fd8c7 100644 --- a/react-ui/src/stores/reducer/device.reducer.ts +++ b/react-ui/src/stores/reducer/device.reducer.ts @@ -1,40 +1,46 @@ -import { api, NetworkelementFlattenedManagedNetworkElement, NetworkElementServiceGetAllFlattenedApiArg } from '@api/api'; -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { api, NetworkelementFlattenedManagedNetworkElement, NetworkElementServiceGetAllFlattenedApiArg, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; +import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; import { RootState } from '..'; import { startListening } from '../middleware/listener.middleware'; import { setUser } from './user.reducer'; +import { DeviceViewTabValues } from '@view/device/deivce.view.tabs'; type Device = NetworkelementFlattenedManagedNetworkElement; export interface DeviceSliceState { devices: Device[], + pnds: PndPrincipalNetworkDomain[], + + activeTab: DeviceViewTabValues } const initialState: DeviceSliceState = { devices: [], + pnds: [], + activeTab: DeviceViewTabValues.METADATA } - - - const deviceSlice = createSlice({ name: 'device', initialState, reducers: { setDevices: (state, action: PayloadAction<Device[]>) => { state.devices = action.payload }, + setPnds: (state, action: PayloadAction<PndPrincipalNetworkDomain[]>) => { state.pnds = action.payload }, + setActiveTab: (state, action: PayloadAction<DeviceViewTabValues>) => { state.activeTab = action.payload }, }, }) -export const { setDevices } = deviceSlice.actions +export const { setDevices, setActiveTab } = deviceSlice.actions +const { setPnds } = deviceSlice.actions export default deviceSlice.reducer export const deviceReducerPath = deviceSlice.reducerPath; -let fetchSubscription: QueryActionCreatorResult<any>[] = []; +let fetchSubscription: QueryActionCreatorResult<any>[] = []; export const abortFetching = () => { fetchSubscription.forEach((subscription) => { subscription.unsubscribe(); @@ -43,7 +49,7 @@ export const abortFetching = () => { } // continously fetch devices -const FETCH_DEVICES_INTERVAL = 5000; // in ms +const FETCH_DEVICES_INTERVAL = 15000; // in ms startListening({ actionCreator: setUser, effect: async (_, listenerApi) => { @@ -71,4 +77,15 @@ startListening({ effect: async (action, listenerApi) => { listenerApi.dispatch(setDevices(action.payload.mne)); }, -}) \ No newline at end of file +}) + +export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { + const payload: PndServiceGetPndListApiArg = { + timestamp: new Date().getTime().toString(), + } + + const subscription = thunkApi.dispatch(api.endpoints.pndServiceGetPndList.initiate(payload)); + subscription.unwrap().then((response) => { + thunkApi.dispatch(setPnds(response.pnd)); + }); +}); diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/stores/reducer/user.reducer.ts index 797626db0..ce9f2b502 100644 --- a/react-ui/src/stores/reducer/user.reducer.ts +++ b/react-ui/src/stores/reducer/user.reducer.ts @@ -1,8 +1,7 @@ import { api, RbacUser, UserServiceGetUsersApiArg } from '@api/api'; +import { setCookieValue } from '@helper/coookie'; import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '..'; -import { startListening } from '../middleware/listener.middleware'; -import { getCookieValue, setCookieValue } from '@helper/coookie'; export interface UserSliceState { // defined by the frontend user input. This value is getting compared with the backend response diff --git a/react-ui/src/style/box.scss b/react-ui/src/style/box.scss index e7a3ca7d3..bd75fb00a 100644 --- a/react-ui/src/style/box.scss +++ b/react-ui/src/style/box.scss @@ -1,7 +1,7 @@ @import './colors.scss'; $box-padding: 10px; -$border-radius: 10px; +$border-radius: 20px; .c-box { diff --git a/react-ui/src/style/utils.scss b/react-ui/src/style/utils.scss index 9dd71c4b8..d8be654f7 100644 --- a/react-ui/src/style/utils.scss +++ b/react-ui/src/style/utils.scss @@ -10,4 +10,4 @@ .icon { font-size: 1.75em; -} \ No newline at end of file +} diff --git a/react-ui/src/utils/helper/coookie.ts b/react-ui/src/utils/helper/coookie.ts index 75cba2dc8..d15e2702c 100644 --- a/react-ui/src/utils/helper/coookie.ts +++ b/react-ui/src/utils/helper/coookie.ts @@ -10,5 +10,5 @@ export const getCookieValue = (name: string): string => { } export const setCookieValue = (key: string, value: string): void => { - document.cookie = `${key}=${value}; Secure; SameSite=Lax`; + document.cookie = `${key}=${value}; Secure; SameSite=Lax; path=/`; } \ No newline at end of file diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx index 834b2ac5f..588491230 100644 --- a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx @@ -9,6 +9,8 @@ import { Link, Outlet, useNavigate } from "react-router-dom"; import "./protected.layout.scss"; import { useAppDispatch, useAppSelector } from '@hooks'; import { fetchUser } from '@reducer/user.reducer'; +import { fetchPnds } from '@reducer/device.reducer'; +import { DEVICE_URL, LOGIN_URL } from '@routes'; export const ProtectedLayout = () => { @@ -20,11 +22,12 @@ export const ProtectedLayout = () => { useEffect(() => { if (!isAuthenticated()) { - navigate('/login') + navigate(LOGIN_URL) return; } dispatch(fetchUser()); + dispatch(fetchPnds()); }, []); /** @@ -78,7 +81,7 @@ export const ProtectedLayout = () => { return ( <nav className="bg-white border-bottom border-dark py-2 d-flex align-items-center"> <Link to="/"><img src={logo} className="mx-4 me-5" width={25} alt="logo" /></Link> - <Link className={"head-links" + handleActiveLink('/')} to="/">{t('protected.link.device_list')}</Link> + <Link className={"head-links" + handleActiveLink(DEVICE_URL)} to="/">{t('protected.link.device_list')}</Link> <Link className={"head-links" + handleActiveLink('/map')} to="/">{t('protected.link.map')}</Link> <Link className={"head-links" + handleActiveLink('/configuration_management')} to="/">{t('protected.link.configuration_mgmt')}</Link> diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/utils/provider/auth.provider.tsx index 638d9b408..e3a90d711 100644 --- a/react-ui/src/utils/provider/auth.provider.tsx +++ b/react-ui/src/utils/provider/auth.provider.tsx @@ -3,6 +3,7 @@ import { getCookieValue } from "@helper/coookie"; import { useAppDispatch, useAppSelector } from "@hooks"; import { abortFetching } from "@reducer/device.reducer"; import { setToken } from "@reducer/user.reducer"; +import { DEVICE_URL, LOGIN_URL } from "@routes"; import { jwtDecode } from "jwt-decode"; import { createContext, useContext, useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; @@ -38,9 +39,9 @@ export const AuthProvider = ({ children }) => { const token = getCookieValue('token'); if (token) { - navigate('/') + navigate(DEVICE_URL) } else { - navigate('/login') + navigate(LOGIN_URL) } }, [username]); @@ -75,7 +76,7 @@ export const AuthProvider = ({ children }) => { } dispatch(setToken({ token: response.token, username })); - navigate('/'); + navigate(DEVICE_URL); }).catch((error) => { // determine whether 500 or 401 err }); diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index cc5d30818..32b67b0d1 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -30,6 +30,7 @@ "@provider/*": ["src/utils/provider/*"], "@layout/*": ["src/utils/layouts/*"], "@hooks": ["src/hooks"], + "@routes": ["src/routes.tsx"], "@task/*": ["src/utils/tasks/*"], "@helper/*": ["src/utils/helper/*"], } diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index dee436d2a..c5073c14e 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -38,6 +38,7 @@ export default defineConfig({ "@hooks": "/src/hooks.ts", "@task": "/src/utils/tasks", "@helper": "/src/utils/helper", + "@routes": "/src/routes.tsx", }, }, -- GitLab From 6ae2897f69ad1534cf43cc7ce114efc5687121f8 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 16 Sep 2024 13:45:45 +0200 Subject: [PATCH 24/78] apply some styles to device page --- .../src/components/view/device/device.scss | 39 +++++++++++++++++++ .../components/view/device/device.view.tsx | 31 +++++++-------- react-ui/src/style/fonts.scss | 7 ++-- 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/react-ui/src/components/view/device/device.scss b/react-ui/src/components/view/device/device.scss index 826b7c293..d24b08084 100644 --- a/react-ui/src/components/view/device/device.scss +++ b/react-ui/src/components/view/device/device.scss @@ -10,4 +10,43 @@ tr:hover > td { tr:nth-child(2n+1) > td { background-color: lighten(map-get($theme-colors, primary) , 38%) +} + +.c-box { + padding: 2em !important; + padding-top: 1em !important; + +} + + + +.border-right { + $border-padding: 2em; + + border-right: 1px solid lighten(map-get($theme-colors, dark), 35%); + padding-right: $border-padding; + + & ~ div { + padding-left: $border-padding; + } +} + +.tab-links { + font-size: 1.5em; + text-decoration: none; + color: map-get($theme-colors, dark); + + &:hover { + color: lighten(map-get($theme-colors, primary), 10%); + } + + &:focus { + border: none !important; + color: lighten(map-get($theme-colors, primary), 10%); + } + + &.active { + color: map-get($theme-colors, primary); + font-weight: 500; + } } \ No newline at end of file diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/view/device/device.view.tsx index 64a5cb93f..d4955d4b3 100644 --- a/react-ui/src/components/view/device/device.view.tsx +++ b/react-ui/src/components/view/device/device.view.tsx @@ -5,7 +5,6 @@ import { useTranslation } from 'react-i18next'; import { DeviceViewTabs, DeviceViewTabValues } from './deivce.view.tabs'; import './device.scss'; import { DeviceViewTable } from './device.view.table'; -import { useParams } from 'react-router-dom'; function DeviceView() { const { t } = useTranslation('common'); @@ -15,37 +14,33 @@ function DeviceView() { return ( <div className='m-4 pt-4'> <Container className="bg-white rounded c-box" fluid> - <Row className='my-2'> - <Col sm={7}><h3 className='text-black-50'>{t('device.title')}</h3></Col> - <Col sm={5}> + <Row> + <Col sm={7} className='border-right mt-4'><h3 className='text-black-50'>{t('device.title')}</h3></Col> + <Col sm={5} className='mt-4'> <Nav className='justify-content-around'> - <NavLink className={handleActiveTabLink(DeviceViewTabValues.METADATA)} onClick={() => setActiveTab(DeviceViewTabValues.METADATA)}>{t('device.tabs.metadata.title')}</NavLink> - <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL)} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> + <NavLink className={handleActiveTabLink(DeviceViewTabValues.METADATA) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.METADATA)}>{t('device.tabs.metadata.title')}</NavLink> + <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> </Nav> </Col> </Row> - <Row> + <Row className='align-items-center'> <Col sm={3}> - <FloatingLabel - controlId="device.search" - label={t('device.search.placeholder')} - className='p-0 mx-2' - > - <Form.Control type="text" placeholder="name@example.com" ref={searchRef} /> - </FloatingLabel> + <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> + <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> + </Form.Group> </Col> - <Col sm={{ span: 2, offset: 2 }}> + <Col sm={{ span: 2, offset: 2 }} className='border-right pt-2'> <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> </Col> </Row> - <Row className='mt-2'> - <Col sm={7}> + <Row className='align-items-start'> + <Col sm={7} className='pt-2 border-right'> {DeviceViewTable(searchRef)} </Col> - <Col sm={5} className='border-left border-primary'> + <Col sm={5} className='pt-2'> {DeviceViewTabs(activeTab)} </Col> </Row> diff --git a/react-ui/src/style/fonts.scss b/react-ui/src/style/fonts.scss index b5f7ec4e6..c47d1a52f 100644 --- a/react-ui/src/style/fonts.scss +++ b/react-ui/src/style/fonts.scss @@ -1,8 +1,9 @@ @font-face { - font-family: inter_font; - src: url("./fonts/Inter.ttf"); + font-family: Inter; + src: url("/fonts/Inter.ttf"); } + * { - font-family: inter_font; + font-family: Inter; } \ No newline at end of file -- GitLab From 3a0dd685db22d9e104731b4839833c2637c60fbe Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Wed, 25 Sep 2024 14:36:37 +0200 Subject: [PATCH 25/78] ui: add subscription pattern --- .../subscriptions/action.subscription.ts | 2 + .../subscriptions/device.subscription.ts | 43 +++++++ .../src/components/subscriptions/index.ts | 26 +++++ .../subscriptions/mne.subscription.ts | 45 ++++++++ .../view/device/deivce.view.tabs.tsx | 28 ----- .../view/device/device.view.table.tsx | 5 +- .../view/device/device.view.tabs.tsx | 57 ++++++++++ .../components/view/device/device.view.tsx | 2 +- .../view_model/device.table.viewmodel.ts | 10 +- .../components/view_model/device.viewmodel.ts | 2 +- react-ui/src/index.tsx | 4 +- react-ui/src/stores/index.ts | 5 +- react-ui/src/stores/persist.store.ts | 8 +- react-ui/src/stores/reducer/device.reducer.ts | 72 ++++-------- .../src/stores/reducer/schedule.reducer.ts | 72 ------------ .../stores/reducer/subscription.reducer.ts | 105 ++++++++++++++++++ .../src/utils/api/subscription.handler.ts | 65 +++++++++++ react-ui/src/utils/provider/auth.provider.tsx | 7 +- react-ui/tsconfig.json | 79 ++++++------- react-ui/vite.config.mjs | 92 ++++++++------- 20 files changed, 486 insertions(+), 243 deletions(-) create mode 100644 react-ui/src/components/subscriptions/action.subscription.ts create mode 100644 react-ui/src/components/subscriptions/device.subscription.ts create mode 100644 react-ui/src/components/subscriptions/index.ts create mode 100644 react-ui/src/components/subscriptions/mne.subscription.ts delete mode 100644 react-ui/src/components/view/device/deivce.view.tabs.tsx create mode 100644 react-ui/src/components/view/device/device.view.tabs.tsx delete mode 100644 react-ui/src/stores/reducer/schedule.reducer.ts create mode 100644 react-ui/src/stores/reducer/subscription.reducer.ts create mode 100644 react-ui/src/utils/api/subscription.handler.ts diff --git a/react-ui/src/components/subscriptions/action.subscription.ts b/react-ui/src/components/subscriptions/action.subscription.ts new file mode 100644 index 000000000..746e3df36 --- /dev/null +++ b/react-ui/src/components/subscriptions/action.subscription.ts @@ -0,0 +1,2 @@ +export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE'; +export const FETCH_DEVICE_ACTION = 'subscription/device/fetchDevices' \ No newline at end of file diff --git a/react-ui/src/components/subscriptions/device.subscription.ts b/react-ui/src/components/subscriptions/device.subscription.ts new file mode 100644 index 000000000..5afcc7c68 --- /dev/null +++ b/react-ui/src/components/subscriptions/device.subscription.ts @@ -0,0 +1,43 @@ +import { NetworkElementServiceGetAllFlattenedApiArg, api } from "@api/api"; +import { setDevices } from "@reducer/device.reducer"; +import { setUser } from "@reducer/user.reducer"; +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { RootState } from "src/stores"; +import { startListening } from "../../../src/stores/middleware/listener.middleware"; +import { FETCH_DEVICE_ACTION } from "./action.subscription"; + +// continously fetch devices +const FETCH_DEVICES_INTERVAL = 15000; // in ms +startListening({ + actionCreator: setUser, + effect: async (_, listenerApi) => { + listenerApi.dispatch(fetchDevicesThunk()); + }, +}) + +export const fetchDevicesThunk = createAsyncThunk(FETCH_DEVICE_ACTION, (_, thunkApi) => { + const { user } = thunkApi.getState() as RootState; + + const payload: NetworkElementServiceGetAllFlattenedApiArg = { + pid: Object.keys(user?.user.roles)[0], + timestamp: new Date().getTime().toString(), + } + + const subscription = thunkApi.dispatch(api.endpoints.networkElementServiceGetAllFlattened.initiate(payload, { + subscriptionOptions: { + pollingInterval: FETCH_DEVICES_INTERVAL, + skipPollingIfUnfocused: true, + } + })); + + return subscription; +}); + + +// save fetched devices +startListening({ + predicate: (action) => api.endpoints.networkElementServiceGetAllFlattened.matchFulfilled(action), + effect: async (action, listenerApi) => { + listenerApi.dispatch(setDevices(action.payload.mne)); + }, +}) \ No newline at end of file diff --git a/react-ui/src/components/subscriptions/index.ts b/react-ui/src/components/subscriptions/index.ts new file mode 100644 index 000000000..2a3e02f20 --- /dev/null +++ b/react-ui/src/components/subscriptions/index.ts @@ -0,0 +1,26 @@ +import { AsyncThunk } from '@reduxjs/toolkit'; +import { fetchDevicesThunk } from './device.subscription'; +import { fetchSelectedMneThunk } from './mne.subscription'; + + +export enum THUNK_TYPE { + MNE = 'device/fetch', + DEVICE = 'mne/fetch', +} + +export interface SubscriptionThunkModule { + thunkFn?: AsyncThunk<any, any, {}> + type: THUNK_TYPE, +} + +export const SubscriptionThunks: SubscriptionThunkModule[] = [ + { + thunkFn: fetchDevicesThunk, + type: THUNK_TYPE.DEVICE + }, { + + thunkFn: fetchSelectedMneThunk, + type: THUNK_TYPE.MNE + } +] + diff --git a/react-ui/src/components/subscriptions/mne.subscription.ts b/react-ui/src/components/subscriptions/mne.subscription.ts new file mode 100644 index 000000000..b2b036007 --- /dev/null +++ b/react-ui/src/components/subscriptions/mne.subscription.ts @@ -0,0 +1,45 @@ +import { api, NetworkElementServiceGetApiArg } from "@api/api"; +import { Device, setSelectedDevice, setSelectedMne } from "@reducer/device.reducer"; +import { CATEGORIES, triggerSubscription } from "@reducer/subscription.reducer"; +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { RootState } from "src/stores"; +import { THUNK_TYPE } from "."; +import { startListening } from "../../../src/stores/middleware/listener.middleware"; +import { FETCH_MNE_ACTION } from "./action.subscription"; + +// fetch mne if selected device is set +startListening({ + predicate: (action) => setSelectedDevice.match(action) && !!action.payload, + effect: async (action, listenerApi) => { + listenerApi.dispatch(triggerSubscription({category: CATEGORIES.TAB, thunkType: THUNK_TYPE.MNE, payload: action.payload})); + }, +}) + + +const FETCH_MNE_INTERVAL = 5000; // in ms +export const fetchSelectedMneThunk = createAsyncThunk(FETCH_MNE_ACTION, async (device: Device, thunkApi) => { + const { user } = thunkApi.getState() as RootState; + + const payload: NetworkElementServiceGetApiArg = { + pid: Object.keys(user?.user.roles)[0], + timestamp: new Date().getTime().toString(), + mneid: device.id, + } + + const subscription = thunkApi.dispatch(api.endpoints.networkElementServiceGet.initiate(payload, { + subscriptionOptions: { + pollingInterval: FETCH_MNE_INTERVAL, + skipPollingIfUnfocused: true, + } + })); + + return {...subscription}; +}); + +// save fetched mne +startListening({ + predicate: (action) => api.endpoints.networkElementServiceGet.matchFulfilled(action), + effect: async (action, listenerApi) => { + listenerApi.dispatch(setSelectedMne(action.payload.mne)); + }, +}) \ No newline at end of file diff --git a/react-ui/src/components/view/device/deivce.view.tabs.tsx b/react-ui/src/components/view/device/deivce.view.tabs.tsx deleted file mode 100644 index a49c7616b..000000000 --- a/react-ui/src/components/view/device/deivce.view.tabs.tsx +++ /dev/null @@ -1,28 +0,0 @@ - -export enum DeviceViewTabValues { - METADATA = 'metadata', - YANGMODEL = 'yang_model' -} - -export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { - - const metadataTab = () => { - return ( - <div>test</div> - ) - } - - const yangModelTab = () => { - return ( - <div>asdf</div> - ) - } - - - return ( - <> - {(activeTab === DeviceViewTabValues.METADATA) && metadataTab()} - {(activeTab === DeviceViewTabValues.YANGMODEL) && yangModelTab()} - </> - ); -} diff --git a/react-ui/src/components/view/device/device.view.table.tsx b/react-ui/src/components/view/device/device.view.table.tsx index e2e6c4db5..17d4bfd25 100644 --- a/react-ui/src/components/view/device/device.view.table.tsx +++ b/react-ui/src/components/view/device/device.view.table.tsx @@ -7,7 +7,8 @@ import { useTranslation } from "react-i18next"; export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { const { devices, pnds } = useAppSelector(state => state.device); const { t } = useTranslation('common'); - const { searchTerm } = useDeviceTableViewModel(searchRef); + const { searchTerm, trClickHandler } = useDeviceTableViewModel(searchRef); + const cropUUID = (uuid: string): string => { return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); @@ -27,7 +28,7 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = const user = pnds.find(pnd => pnd.id === device.pid); return ( - <tr key={index}> + <tr key={index} onClick={() => trClickHandler(device)}> <td>{device.name}</td> <OverlayTrigger overlay={<Tooltip id={device.id}>{device.id}</Tooltip>}> <td>{cropUUID(device.id)}</td> diff --git a/react-ui/src/components/view/device/device.view.tabs.tsx b/react-ui/src/components/view/device/device.view.tabs.tsx new file mode 100644 index 000000000..cc096b147 --- /dev/null +++ b/react-ui/src/components/view/device/device.view.tabs.tsx @@ -0,0 +1,57 @@ +import { useAppSelector } from "@hooks"; + +export enum DeviceViewTabValues { + METADATA = 'metadata', + YANGMODEL = 'yang_model' +} + +export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { + const { selectedDevice } = useAppSelector(state => state.device); + + + const metadataTab = () => { + return ( + <div> + {selectedDevice.mne.name} + </div> + ) + } + + const yangModelTab = () => { + return ( + <div>asdf</div> + ) + } + + const renderLoading = () => { + return ( + <div> + Loading... + </div> + ) + } + + const renderNoDeviceSelected = () => { + + return ( + <div> + No device selected + </div> + ) + } + + + return ( + <> + {selectedDevice?.mne ? ( + <> + {activeTab === DeviceViewTabValues.METADATA && metadataTab()} + {activeTab === DeviceViewTabValues.YANGMODEL && yangModelTab()} + </> + ) : + selectedDevice ? renderLoading() : renderNoDeviceSelected() + } + + </> + ); +} diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/view/device/device.view.tsx index d4955d4b3..0ef5c05b9 100644 --- a/react-ui/src/components/view/device/device.view.tsx +++ b/react-ui/src/components/view/device/device.view.tsx @@ -2,7 +2,7 @@ import { useDeviceViewModel } from '@viewmodel/device.viewmodel'; import { useRef } from 'react'; import { Button, Col, Container, FloatingLabel, Form, Nav, NavLink, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; -import { DeviceViewTabs, DeviceViewTabValues } from './deivce.view.tabs'; +import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; import './device.scss'; import { DeviceViewTable } from './device.view.table'; diff --git a/react-ui/src/components/view_model/device.table.viewmodel.ts b/react-ui/src/components/view_model/device.table.viewmodel.ts index 224904699..22d8ae9e0 100644 --- a/react-ui/src/components/view_model/device.table.viewmodel.ts +++ b/react-ui/src/components/view_model/device.table.viewmodel.ts @@ -1,7 +1,11 @@ +import { useAppDispatch } from "@hooks"; +import { Device, setSelectedDevice } from "@reducer/device.reducer"; import { useEffect, useState } from "react"; export const useDeviceTableViewModel = (searchRef) => { const [searchTerm, setSearchTerm] = useState(''); + const dispatch = useAppDispatch(); + useEffect(() => { const handleSearchChange = () => { @@ -21,9 +25,13 @@ export const useDeviceTableViewModel = (searchRef) => { }; }, []); + const trClickHandler = (device: Device) => { + dispatch(setSelectedDevice(device)); + } return { - searchTerm + searchTerm, + trClickHandler } } \ No newline at end of file diff --git a/react-ui/src/components/view_model/device.viewmodel.ts b/react-ui/src/components/view_model/device.viewmodel.ts index b7b46cd6a..ec75927f0 100644 --- a/react-ui/src/components/view_model/device.viewmodel.ts +++ b/react-ui/src/components/view_model/device.viewmodel.ts @@ -1,6 +1,6 @@ import { useAppDispatch, useAppSelector } from "@hooks"; import { setActiveTab as setActiveTabState } from "@reducer/device.reducer"; -import { DeviceViewTabValues } from "@view/device/deivce.view.tabs"; +import { DeviceViewTabValues } from "@view/device/device.view.tabs"; export const useDeviceViewModel = () => { const {activeTab} = useAppSelector(state => state.device); diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 3eb8a604f..a2ddc81a9 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -32,4 +32,6 @@ ReactDOM.createRoot(document.getElementById("root")).render( </PersistGate> </Provider> </React.StrictMode> -); \ No newline at end of file +); + +import './components/subscriptions' \ No newline at end of file diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index e00e33f48..8d2be362f 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,11 +1,12 @@ import { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' +import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@subscription/action.subscription' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' import persistStore from 'redux-persist/es/persistStore' import { emptySplitApi } from './api.store' import { rtkQueryErrorLogger } from './middleware/devLogging.middleware' -import persistedReducer from './persist.store' import { listenerMiddleware } from './middleware/listener.middleware' +import persistedReducer from './persist.store' export const store = configureStore({ @@ -13,7 +14,7 @@ export const store = configureStore({ middleware: (getDefaultMiddleware) => getDefaultMiddleware({ serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, FETCH_DEVICE_ACTION + '/fulfilled', FETCH_MNE_ACTION + '/fulfilled'], }, }).prepend(listenerMiddleware.middleware).concat(emptySplitApi.middleware, rtkQueryErrorLogger), }) diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index feb5241a8..f14de1bd7 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,24 +1,24 @@ +import deviceReducer from "@reducer/device.reducer"; +import subscriptionReducer from "@reducer/subscription.reducer"; import userReducer from "@reducer/user.reducer"; import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; import storage from "redux-persist/es/storage"; import { emptySplitApi } from "./api.store"; -import scheduleReducer from "@reducer/schedule.reducer"; -import deviceReducer from "@reducer/device.reducer"; /** local storage config */ const rootPersistConfig = { key: 'root', storage, - blacklist: [emptySplitApi.reducerPath], + blacklist: [emptySplitApi.reducerPath, ], } const rootReducer = combineReducers({ user: userReducer, device: deviceReducer, - scheduler: scheduleReducer, + subscription: subscriptionReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/src/stores/reducer/device.reducer.ts b/react-ui/src/stores/reducer/device.reducer.ts index 3252fd8c7..5919062d2 100644 --- a/react-ui/src/stores/reducer/device.reducer.ts +++ b/react-ui/src/stores/reducer/device.reducer.ts @@ -1,25 +1,30 @@ -import { api, NetworkelementFlattenedManagedNetworkElement, NetworkElementServiceGetAllFlattenedApiArg, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; +import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; -import { RootState } from '..'; +import { DeviceViewTabValues } from '@view/device/device.view.tabs'; import { startListening } from '../middleware/listener.middleware'; -import { setUser } from './user.reducer'; -import { DeviceViewTabValues } from '@view/device/deivce.view.tabs'; -type Device = NetworkelementFlattenedManagedNetworkElement; +export type Device = NetworkelementFlattenedManagedNetworkElement; +interface SelectedDeviceInterface { + device: Device, + mne: NetworkelementManagedNetworkElement | null +} + +type SelectedDeviceType = SelectedDeviceInterface | undefined; export interface DeviceSliceState { devices: Device[], pnds: PndPrincipalNetworkDomain[], - + activeTab: DeviceViewTabValues + selectedDevice: SelectedDeviceType } const initialState: DeviceSliceState = { devices: [], pnds: [], - activeTab: DeviceViewTabValues.METADATA + activeTab: DeviceViewTabValues.METADATA, + selectedDevice: null } const deviceSlice = createSlice({ @@ -29,10 +34,19 @@ const deviceSlice = createSlice({ setDevices: (state, action: PayloadAction<Device[]>) => { state.devices = action.payload }, setPnds: (state, action: PayloadAction<PndPrincipalNetworkDomain[]>) => { state.pnds = action.payload }, setActiveTab: (state, action: PayloadAction<DeviceViewTabValues>) => { state.activeTab = action.payload }, + setSelectedDevice: (state, action: PayloadAction<Device | null>) => { + let selectedDevice: SelectedDeviceType; + if (action.payload) { + selectedDevice = {device: action.payload, mne: null}; + } + + state.selectedDevice = selectedDevice; + }, + setSelectedMne: (state, action: PayloadAction<NetworkelementManagedNetworkElement>) => { state.selectedDevice.mne = action.payload }, }, }) -export const { setDevices, setActiveTab } = deviceSlice.actions +export const { setDevices, setActiveTab, setSelectedDevice, setSelectedMne } = deviceSlice.actions const { setPnds } = deviceSlice.actions export default deviceSlice.reducer @@ -40,45 +54,6 @@ export const deviceReducerPath = deviceSlice.reducerPath; -let fetchSubscription: QueryActionCreatorResult<any>[] = []; -export const abortFetching = () => { - fetchSubscription.forEach((subscription) => { - subscription.unsubscribe(); - }); - fetchSubscription = []; -} - -// continously fetch devices -const FETCH_DEVICES_INTERVAL = 15000; // in ms -startListening({ - actionCreator: setUser, - effect: async (_, listenerApi) => { - const { user } = listenerApi.getState() as RootState; - - const payload: NetworkElementServiceGetAllFlattenedApiArg = { - pid: Object.keys(user?.user.roles)[0], - timestamp: new Date().getTime().toString(), - } - - const subscription = listenerApi.dispatch(api.endpoints.networkElementServiceGetAllFlattened.initiate(payload, { - subscriptionOptions: { - pollingInterval: FETCH_DEVICES_INTERVAL, - skipPollingIfUnfocused: true, - } - })); - - fetchSubscription = [...fetchSubscription, subscription]; - }, -}) - -// save fetched devices -startListening({ - predicate: (action) => api.endpoints.networkElementServiceGetAllFlattened.matchFulfilled(action), - effect: async (action, listenerApi) => { - listenerApi.dispatch(setDevices(action.payload.mne)); - }, -}) - export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { const payload: PndServiceGetPndListApiArg = { timestamp: new Date().getTime().toString(), @@ -89,3 +64,4 @@ export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { thunkApi.dispatch(setPnds(response.pnd)); }); }); + diff --git a/react-ui/src/stores/reducer/schedule.reducer.ts b/react-ui/src/stores/reducer/schedule.reducer.ts deleted file mode 100644 index 2e2bbe36b..000000000 --- a/react-ui/src/stores/reducer/schedule.reducer.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { startListening } from '../middleware/listener.middleware'; - -export enum ScheduleState { INIT, RUNNING, STOPPED } - -export type Task = { - job: (options: object) => void, - interval: number, - type: string -}; - -interface Schedule { - task: Task, - id: number, - state: ScheduleState, - intervalId: NodeJS.Timeout | undefined -} - -export interface ScheduleReducerState { - schedules: Schedule[] -} - -const initialState: ScheduleReducerState = { - schedules: [] -} - -const ScheduleSlice = createSlice({ - name: 'schedule', - initialState, - reducers: { - registerTask: (state, action: PayloadAction<Task>) => { - const newSchedule = { - task: action.payload.task, - id: state.schedules.length, - state: ScheduleState.INIT, - intervalId: undefined - } - - state.schedules = [...state.schedules, newSchedule] - }, - startSchedule: (state, action: PayloadAction<Schedule>) => { - const schedule = action.payload; - schedule.intervalId = setInterval(schedule.task.job, schedule.task.interval); - schedule.state = ScheduleState.RUNNING; - - state.schedules[schedule.id] = schedule; - }, - }, -}) - -export const { registerTask } = ScheduleSlice.actions -export const { startSchedule } = ScheduleSlice.actions - -export default ScheduleSlice.reducer - - -// startListening({ -// actionCreator: addSchedule, - -// effect: (action, listenerApi) => { -// const newState = listenerApi.getState() as ScheduleReducerState; -// const originalState = listenerApi.getOriginalState() as ScheduleReducerState; - -// // get the added schedule -// const schedule = newState.schedules.filter(s => !originalState.schedules.includes(s)).at(0); -// if (!schedule) { -// throw new Error("Added schedule not found in store"); -// } - -// listenerApi.dispatch(startSchedule(schedule)) -// }, -// }) \ No newline at end of file diff --git a/react-ui/src/stores/reducer/subscription.reducer.ts b/react-ui/src/stores/reducer/subscription.reducer.ts new file mode 100644 index 000000000..a21024eab --- /dev/null +++ b/react-ui/src/stores/reducer/subscription.reducer.ts @@ -0,0 +1,105 @@ +import { PayloadAction, createSlice, current } from '@reduxjs/toolkit'; +import { SubscriptionThunks, THUNK_TYPE } from '@subscription/index'; +import { RootState } from '..'; +import { addSubscription, unsubscribe, unsubscribeAll } from '../../utils/api/subscription.handler'; +import { startListening } from '../middleware/listener.middleware'; + + + +interface ThunkEntityDTO { + thunkType: THUNK_TYPE, + payload: any + + /** + * Only one subscription per category is allowed. New subscription will unsubscribe and overwrite the old one + */ + category: CATEGORIES, +} + +interface ThunkEntity extends ThunkEntityDTO { + id?: number, + locked: boolean +} + + +export interface SubscriptionReducerState { + thunks: {[key in keyof typeof CATEGORIES]: ThunkEntity | null} +} + +export enum CATEGORIES { + TABLE, + TAB +} + +const initialState: SubscriptionReducerState = { + thunks: { + TABLE: null, + TAB: null + } +} + +const SubscriptionSlice = createSlice({ + name: 'subscription', + initialState, + reducers: { + triggerSubscription: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { + // overwrite old subscription if it exists + const currentState = current(state) + const currentThunk = currentState.thunks[CATEGORIES[payload.category]]; + + const newThunk: ThunkEntity = {...payload, locked: true}; + + state.thunks[CATEGORIES[payload.category]] = newThunk; + }, + + setThunkId: (state, {payload}: PayloadAction<{id: number, category: CATEGORIES}>) => { + let thunk = state.thunks[CATEGORIES[payload.category]]; + + if (!thunk) { + // TODO + throw new Error('Thunk not found'); + } + + state.thunks[CATEGORIES[payload.category]] = {...thunk, id: payload.id, locked: false}; + }, + + stopAllSubscriptions: (state) => { + unsubscribeAll() + state.thunks = initialState.thunks; + }, + }, +}) + +export const { triggerSubscription, stopAllSubscriptions } = SubscriptionSlice.actions + +// unsubscribe old subscription +startListening({ + predicate: (action) => triggerSubscription.match(action), + effect: async (action, listenerApi) => { + const {subscription} = listenerApi.getOriginalState() as RootState; + const lastThunk = subscription.thunks[CATEGORIES[action.payload.category]]; + unsubscribe(lastThunk.id); + }, +}) + +// add new subscription +startListening({ + predicate: (action) => triggerSubscription.match(action), + effect: async (action, listenerApi) => { + const {thunkType} = action.payload as ThunkEntity; + + const {thunkFn} = SubscriptionThunks.find(({type}) => type === thunkType); + if (!thunkFn) { + // TODO + throw new Error('Thunk not found'); + } + + const subscription = await listenerApi.dispatch(thunkFn(action.payload.payload)); + const thunkId = await addSubscription(subscription.payload); + listenerApi.dispatch(SubscriptionSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); + + }, +}) + + +export default SubscriptionSlice.reducer diff --git a/react-ui/src/utils/api/subscription.handler.ts b/react-ui/src/utils/api/subscription.handler.ts new file mode 100644 index 000000000..e288a4a6f --- /dev/null +++ b/react-ui/src/utils/api/subscription.handler.ts @@ -0,0 +1,65 @@ +import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; + +type SubscriptionType = QueryActionCreatorResult<any>; + +interface SubscriptionEntity { + subscription: SubscriptionType, + id: number +} + +interface SubscriptionReducerState { + subscriptions: SubscriptionEntity[] +} + + +const initialState: SubscriptionReducerState = { + subscriptions: [] +} + +let state = initialState; + + +export const addSubscription = (subscription: SubscriptionType): number => { + const id = state.subscriptions.length; + + const subscriptionEntity: SubscriptionEntity = { + subscription, + id + } + + state.subscriptions = [...state.subscriptions, subscriptionEntity]; + + return id; +} + + +export const unsubscribeAll = () => { + state.subscriptions.forEach(({ subscription }) => { + unsubscribeAction(subscription) + }); + + state.subscriptions = initialState.subscriptions; +} + +/** + * @param id + * @returns returns true if the subscription was stopped, false if it was not found + */ +export const unsubscribe = (id: number): boolean => { + const subscription = state.subscriptions.find(({ id: subscriptionId }) => subscriptionId === id); + + if (subscription) { + unsubscribeAction(subscription.subscription); + } + + return !!subscription; +} + +/** + * Actual unsubscribe action + * + * @param subscription + */ +const unsubscribeAction = (subscription: SubscriptionType) => { + subscription.unsubscribe(); +} \ No newline at end of file diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/utils/provider/auth.provider.tsx index e3a90d711..44901c66f 100644 --- a/react-ui/src/utils/provider/auth.provider.tsx +++ b/react-ui/src/utils/provider/auth.provider.tsx @@ -1,7 +1,7 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; +import { unsubscribeAll } from "@api/subscription.handler"; import { getCookieValue } from "@helper/coookie"; import { useAppDispatch, useAppSelector } from "@hooks"; -import { abortFetching } from "@reducer/device.reducer"; import { setToken } from "@reducer/user.reducer"; import { DEVICE_URL, LOGIN_URL } from "@routes"; import { jwtDecode } from "jwt-decode"; @@ -37,7 +37,7 @@ export const AuthProvider = ({ children }) => { useEffect(() => { const token = getCookieValue('token'); - + if (token) { navigate(DEVICE_URL) } else { @@ -100,7 +100,7 @@ export const AuthProvider = ({ children }) => { } const logout = () => { - abortFetching(); + unsubscribeAll(); dispatch(setToken(null)); // TODO: purge other information } @@ -125,3 +125,4 @@ export const AuthProvider = ({ children }) => { export const useAuth = () => { return useContext(AuthContext); } + diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 32b67b0d1..41c9c8f66 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -1,44 +1,47 @@ { "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": false, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, - "baseUrl": ".", - "paths": { - "@assets/*": ["assets/*"], - "@api/*": ["src/utils/api/*"], - "@viewmodel/*": ["src/components/view_model/*"], - "@view/*": ["src/components/view/*"], - "@reducer/*": ["src/stores/reducer/*"], - "@provider/*": ["src/utils/provider/*"], - "@layout/*": ["src/utils/layouts/*"], - "@hooks": ["src/hooks"], - "@routes": ["src/routes.tsx"], - "@task/*": ["src/utils/tasks/*"], - "@helper/*": ["src/utils/helper/*"], - } + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": ".", + "paths": { + "@assets/*": ["assets/*"], + "@api/*": ["src/utils/api/*"], + "@viewmodel/*": ["src/components/view_model/*"], + "@view/*": ["src/components/view/*"], + "@reducer/*": ["src/stores/reducer/*"], + "@provider/*": ["src/utils/provider/*"], + "@layout/*": ["src/utils/layouts/*"], + "@hooks": ["src/hooks"], + "@routes": ["src/routes.tsx"], + "@task/*": ["src/utils/tasks/*"], + "@helper/*": ["src/utils/helper/*"], + "@subscription/*": ["src/components/subscriptions/*"] + } }, "include": [ - "src/**/*.d.ts", - "src/**/*.ts", - "src/**/*.tsx", "src/stores/api.store.ts", "scripts/test.ts", - ], + "src/**/*.d.ts", + "src/**/*.ts", + "src/**/*.tsx", + "src/stores/api.store.ts", + "scripts/test.ts" + ] //"references": [{ "path": "./tsconfig.node.json" }] -} \ No newline at end of file +} diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index c5073c14e..96be1c844 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -1,48 +1,56 @@ -import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' - +import { defineConfig } from 'vite' export default defineConfig({ - plugins: [react()], - server: { - port: 3000, - proxy: { - '/api': { - target: 'http://127.0.0.1:8080', - changeOrigin: true, - secure: false, - rewrite: (path) => path.replace(/^\/api/, ''), - configure: (proxy, _options) => { - proxy.on('error', (err, _req, _res) => { - console.log('proxy error', err); - }); - proxy.on('proxyReq', (proxyReq, req, _res) => { - console.log('Sending Request to the Target:', req.method, req.url); - }); - proxy.on('proxyRes', (proxyRes, req, _res) => { - console.log('Received Response from the Target:', proxyRes.statusCode, req.url); - }); + plugins: [react()], + server: { + port: 3000, + proxy: { + '/api': { + target: 'http://127.0.0.1:8080', + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/api/, ''), + configure: (proxy, _options) => { + proxy.on('error', (err, _req, _res) => { + console.log('proxy error', err) + }) + proxy.on('proxyReq', (proxyReq, req, _res) => { + console.log( + 'Sending Request to the Target:', + req.method, + req.url + ) + }) + proxy.on('proxyRes', (proxyRes, req, _res) => { + console.log( + 'Received Response from the Target:', + proxyRes.statusCode, + req.url + ) + }) + }, + }, + }, + }, + resolve: { + alias: { + '@assets': '/assets', + '@api': '/src/utils/api', + '@viewmodel': '/src/components/view_model', + '@view': '/src/components/view', + '@reducer': '/src/stores/reducer', + '@provider': '/src/utils/provider', + '@layout': '/src/utils/layouts', + '@hooks': '/src/hooks.ts', + '@task': '/src/utils/tasks', + '@helper': '/src/utils/helper', + '@routes': '/src/routes.tsx', + '@subscription': '/src/components/subscriptions', }, - } - } - }, - resolve: { - alias: { - '@assets': '/assets', - '@api': '/src/utils/api', - "@viewmodel": "/src/components/view_model", - "@view": "/src/components/view", - "@reducer": "/src/stores/reducer", - "@provider": "/src/utils/provider", - "@layout": "/src/utils/layouts", - "@hooks": "/src/hooks.ts", - "@task": "/src/utils/tasks", - "@helper": "/src/utils/helper", - "@routes": "/src/routes.tsx", }, - }, - build: { - sourcemap: true, // Source Maps für den Build aktivieren - }, -}); \ No newline at end of file + build: { + sourcemap: true, // Source Maps für den Build aktivieren + }, +}) -- GitLab From f7ebbdb5d133d852159611c61419dd4df3ef271f Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Wed, 25 Sep 2024 14:54:47 +0200 Subject: [PATCH 26/78] ui: refactor SubscriptionHandler --- .../stores/reducer/subscription.reducer.ts | 29 ++++--- .../src/utils/api/subscription.handler.ts | 87 ++++++++++--------- react-ui/src/utils/provider/auth.provider.tsx | 2 - 3 files changed, 62 insertions(+), 56 deletions(-) diff --git a/react-ui/src/stores/reducer/subscription.reducer.ts b/react-ui/src/stores/reducer/subscription.reducer.ts index a21024eab..344b42d25 100644 --- a/react-ui/src/stores/reducer/subscription.reducer.ts +++ b/react-ui/src/stores/reducer/subscription.reducer.ts @@ -1,8 +1,9 @@ -import { PayloadAction, createSlice, current } from '@reduxjs/toolkit'; +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; import { SubscriptionThunks, THUNK_TYPE } from '@subscription/index'; import { RootState } from '..'; -import { addSubscription, unsubscribe, unsubscribeAll } from '../../utils/api/subscription.handler'; +import { SubscriptionHandler } from '../../utils/api/subscription.handler'; import { startListening } from '../middleware/listener.middleware'; +import { setToken } from './user.reducer'; @@ -43,12 +44,7 @@ const SubscriptionSlice = createSlice({ initialState, reducers: { triggerSubscription: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { - // overwrite old subscription if it exists - const currentState = current(state) - const currentThunk = currentState.thunks[CATEGORIES[payload.category]]; - const newThunk: ThunkEntity = {...payload, locked: true}; - state.thunks[CATEGORIES[payload.category]] = newThunk; }, @@ -63,14 +59,23 @@ const SubscriptionSlice = createSlice({ state.thunks[CATEGORIES[payload.category]] = {...thunk, id: payload.id, locked: false}; }, - stopAllSubscriptions: (state) => { - unsubscribeAll() + removeAll: (state) => { + SubscriptionHandler.unsubscribeAll() state.thunks = initialState.thunks; }, }, }) -export const { triggerSubscription, stopAllSubscriptions } = SubscriptionSlice.actions +export const { triggerSubscription } = SubscriptionSlice.actions + +// on logout remove all subscriptions +startListening({ + predicate: (action) => setToken.match(action) && action.payload.token === null, + effect: async (_, listenerApi) => { + listenerApi.dispatch(SubscriptionSlice.actions.removeAll()); + }, +}) + // unsubscribe old subscription startListening({ @@ -78,7 +83,7 @@ startListening({ effect: async (action, listenerApi) => { const {subscription} = listenerApi.getOriginalState() as RootState; const lastThunk = subscription.thunks[CATEGORIES[action.payload.category]]; - unsubscribe(lastThunk.id); + SubscriptionHandler.unsubscribe(lastThunk.id); }, }) @@ -95,7 +100,7 @@ startListening({ } const subscription = await listenerApi.dispatch(thunkFn(action.payload.payload)); - const thunkId = await addSubscription(subscription.payload); + const thunkId = await SubscriptionHandler.add(subscription.payload); listenerApi.dispatch(SubscriptionSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); }, diff --git a/react-ui/src/utils/api/subscription.handler.ts b/react-ui/src/utils/api/subscription.handler.ts index e288a4a6f..e065879f0 100644 --- a/react-ui/src/utils/api/subscription.handler.ts +++ b/react-ui/src/utils/api/subscription.handler.ts @@ -1,65 +1,68 @@ import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; -type SubscriptionType = QueryActionCreatorResult<any>; +type Subscription = QueryActionCreatorResult<any>; -interface SubscriptionEntity { - subscription: SubscriptionType, +interface Entity { + subscription: Subscription, id: number } -interface SubscriptionReducerState { - subscriptions: SubscriptionEntity[] -} - -const initialState: SubscriptionReducerState = { - subscriptions: [] +const initialState = { + subscriptions: [] as Entity[] } -let state = initialState; +export const SubscriptionHandler = (() => { + let state = initialState; + const add = (subscription: Subscription): number => { + const id = state.subscriptions.length; + const subscriptionEntity: Entity = { + subscription, + id + } -export const addSubscription = (subscription: SubscriptionType): number => { - const id = state.subscriptions.length; + state.subscriptions = [...state.subscriptions, subscriptionEntity]; - const subscriptionEntity: SubscriptionEntity = { - subscription, - id + return id; } - state.subscriptions = [...state.subscriptions, subscriptionEntity]; - return id; -} + const unsubscribeAll = () => { + state.subscriptions.forEach(({ subscription }) => { + unsubscribeAction(subscription) + }); + state.subscriptions = initialState.subscriptions; + } -export const unsubscribeAll = () => { - state.subscriptions.forEach(({ subscription }) => { - unsubscribeAction(subscription) - }); + /** + * @param id + * @returns returns true if the subscription was stopped, false if it was not found + */ + const unsubscribe = (id: number): boolean => { + const subscription = state.subscriptions.find(({ id: subscriptionId }) => subscriptionId === id); - state.subscriptions = initialState.subscriptions; -} + if (subscription) { + unsubscribeAction(subscription.subscription); + } -/** - * @param id - * @returns returns true if the subscription was stopped, false if it was not found - */ -export const unsubscribe = (id: number): boolean => { - const subscription = state.subscriptions.find(({ id: subscriptionId }) => subscriptionId === id); + return !!subscription; + } - if (subscription) { - unsubscribeAction(subscription.subscription); + /** + * Actual unsubscribe action + * + * @param subscription + */ + const unsubscribeAction = (subscription: Subscription) => { + subscription.unsubscribe(); } - return !!subscription; -} -/** - * Actual unsubscribe action - * - * @param subscription - */ -const unsubscribeAction = (subscription: SubscriptionType) => { - subscription.unsubscribe(); -} \ No newline at end of file + return { + add, + unsubscribe, + unsubscribeAll + } +})(); \ No newline at end of file diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/utils/provider/auth.provider.tsx index 44901c66f..d1f472cc7 100644 --- a/react-ui/src/utils/provider/auth.provider.tsx +++ b/react-ui/src/utils/provider/auth.provider.tsx @@ -1,5 +1,4 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; -import { unsubscribeAll } from "@api/subscription.handler"; import { getCookieValue } from "@helper/coookie"; import { useAppDispatch, useAppSelector } from "@hooks"; import { setToken } from "@reducer/user.reducer"; @@ -100,7 +99,6 @@ export const AuthProvider = ({ children }) => { } const logout = () => { - unsubscribeAll(); dispatch(setToken(null)); // TODO: purge other information } -- GitLab From 80387ce6a011405e9eab62143cffa02c446afbba Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Wed, 25 Sep 2024 15:09:56 +0200 Subject: [PATCH 27/78] ui: refactor utils path --- react-ui/docs/routine_pattern.md | 18 ++++ react-ui/docs/routine_pattern.png | Bin 0 -> 102971 bytes .../action.routine.ts} | 0 .../device.routine.ts} | 6 +- .../src/components/subscriptions/index.ts | 26 ------ .../components/view/device/device.view.tsx | 10 +- .../view_model/device.table.viewmodel.ts | 2 +- .../components/view_model/device.viewmodel.ts | 2 +- react-ui/src/index.tsx | 5 +- react-ui/src/routes.tsx | 10 +- react-ui/src/{utils => shared}/api/api.ts | 0 .../src/{utils => shared}/helper/coookie.ts | 0 react-ui/src/{utils => shared}/icons/icons.ts | 0 .../layouts/basic.layout.tsx | 4 +- .../layouts/login.layout.tsx | 0 .../protected.layout/protected.layout.scss | 0 .../protected.layout/protected.layout.tsx | 8 +- .../provider/auth.provider.tsx | 0 react-ui/src/shared/utils/routine.manager.ts | 88 ++++++++++++++++++ react-ui/src/stores/index.ts | 4 +- react-ui/src/stores/persist.store.ts | 6 +- .../{ => device.reducer}/device.reducer.ts | 1 - .../device.reducer}/mne.subscription.ts | 12 +-- ...cription.reducer.ts => routine.reducer.ts} | 68 ++++++++------ .../src/utils/api/subscription.handler.ts | 68 -------------- react-ui/tsconfig.json | 13 +-- react-ui/vite.config.mjs | 13 +-- 27 files changed, 196 insertions(+), 168 deletions(-) create mode 100644 react-ui/docs/routine_pattern.md create mode 100644 react-ui/docs/routine_pattern.png rename react-ui/src/components/{subscriptions/action.subscription.ts => routines/action.routine.ts} (100%) rename react-ui/src/components/{subscriptions/device.subscription.ts => routines/device.routine.ts} (86%) delete mode 100644 react-ui/src/components/subscriptions/index.ts rename react-ui/src/{utils => shared}/api/api.ts (100%) rename react-ui/src/{utils => shared}/helper/coookie.ts (100%) rename react-ui/src/{utils => shared}/icons/icons.ts (100%) rename react-ui/src/{utils => shared}/layouts/basic.layout.tsx (88%) rename react-ui/src/{utils => shared}/layouts/login.layout.tsx (100%) rename react-ui/src/{utils => shared}/layouts/protected.layout/protected.layout.scss (100%) rename react-ui/src/{utils => shared}/layouts/protected.layout/protected.layout.tsx (98%) rename react-ui/src/{utils => shared}/provider/auth.provider.tsx (100%) create mode 100644 react-ui/src/shared/utils/routine.manager.ts rename react-ui/src/stores/reducer/{ => device.reducer}/device.reducer.ts (97%) rename react-ui/src/{components/subscriptions => stores/reducer/device.reducer}/mne.subscription.ts (75%) rename react-ui/src/stores/reducer/{subscription.reducer.ts => routine.reducer.ts} (51%) delete mode 100644 react-ui/src/utils/api/subscription.handler.ts diff --git a/react-ui/docs/routine_pattern.md b/react-ui/docs/routine_pattern.md new file mode 100644 index 000000000..97a29da31 --- /dev/null +++ b/react-ui/docs/routine_pattern.md @@ -0,0 +1,18 @@ +## Routine pattern +The goal is to get a generic architecture to invoke persist and rerun asynchronous actions (thunks). + + +### Goals +* Invoke asyncronous actions +* Rerun actions after page reload by persisting +* Ability to access and manipulate the redux state +* Give a simple interface to the outside world by abstracting the task to achive the upper goals + + +### Usage +Add + + +### Description +The image displays the whole workflow starting by the user that clicks a button. The actual routine pattern takes place within the red border. + diff --git a/react-ui/docs/routine_pattern.png b/react-ui/docs/routine_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..86b582398523ed51922d8ebad316c15be59265db GIT binary patch literal 102971 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	TXYl1Gq9K%>XO|KO^NnfVX9 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 literal 0 HcmV?d00001 diff --git a/react-ui/src/components/subscriptions/action.subscription.ts b/react-ui/src/components/routines/action.routine.ts similarity index 100% rename from react-ui/src/components/subscriptions/action.subscription.ts rename to react-ui/src/components/routines/action.routine.ts diff --git a/react-ui/src/components/subscriptions/device.subscription.ts b/react-ui/src/components/routines/device.routine.ts similarity index 86% rename from react-ui/src/components/subscriptions/device.subscription.ts rename to react-ui/src/components/routines/device.routine.ts index 5afcc7c68..0290f637d 100644 --- a/react-ui/src/components/subscriptions/device.subscription.ts +++ b/react-ui/src/components/routines/device.routine.ts @@ -1,10 +1,10 @@ import { NetworkElementServiceGetAllFlattenedApiArg, api } from "@api/api"; -import { setDevices } from "@reducer/device.reducer"; +import { setDevices } from "@reducer/device.reducer/device.reducer"; import { setUser } from "@reducer/user.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; import { RootState } from "src/stores"; -import { startListening } from "../../../src/stores/middleware/listener.middleware"; -import { FETCH_DEVICE_ACTION } from "./action.subscription"; +import { startListening } from "../../stores/middleware/listener.middleware"; +import { FETCH_DEVICE_ACTION } from "./action.routine"; // continously fetch devices const FETCH_DEVICES_INTERVAL = 15000; // in ms diff --git a/react-ui/src/components/subscriptions/index.ts b/react-ui/src/components/subscriptions/index.ts deleted file mode 100644 index 2a3e02f20..000000000 --- a/react-ui/src/components/subscriptions/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { AsyncThunk } from '@reduxjs/toolkit'; -import { fetchDevicesThunk } from './device.subscription'; -import { fetchSelectedMneThunk } from './mne.subscription'; - - -export enum THUNK_TYPE { - MNE = 'device/fetch', - DEVICE = 'mne/fetch', -} - -export interface SubscriptionThunkModule { - thunkFn?: AsyncThunk<any, any, {}> - type: THUNK_TYPE, -} - -export const SubscriptionThunks: SubscriptionThunkModule[] = [ - { - thunkFn: fetchDevicesThunk, - type: THUNK_TYPE.DEVICE - }, { - - thunkFn: fetchSelectedMneThunk, - type: THUNK_TYPE.MNE - } -] - diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/view/device/device.view.tsx index 0ef5c05b9..c85ce6be6 100644 --- a/react-ui/src/components/view/device/device.view.tsx +++ b/react-ui/src/components/view/device/device.view.tsx @@ -1,10 +1,10 @@ import { useDeviceViewModel } from '@viewmodel/device.viewmodel'; import { useRef } from 'react'; -import { Button, Col, Container, FloatingLabel, Form, Nav, NavLink, Row } from 'react-bootstrap'; +import { Button, Col, Container, Form, Nav, NavLink, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; -import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; import './device.scss'; import { DeviceViewTable } from './device.view.table'; +import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; function DeviceView() { const { t } = useTranslation('common'); @@ -27,9 +27,9 @@ function DeviceView() { <Row className='align-items-center'> <Col sm={3}> - <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> - <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> - </Form.Group> + <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> + <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> + </Form.Group> </Col> <Col sm={{ span: 2, offset: 2 }} className='border-right pt-2'> <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> diff --git a/react-ui/src/components/view_model/device.table.viewmodel.ts b/react-ui/src/components/view_model/device.table.viewmodel.ts index 22d8ae9e0..0802d6b57 100644 --- a/react-ui/src/components/view_model/device.table.viewmodel.ts +++ b/react-ui/src/components/view_model/device.table.viewmodel.ts @@ -1,5 +1,5 @@ import { useAppDispatch } from "@hooks"; -import { Device, setSelectedDevice } from "@reducer/device.reducer"; +import { Device, setSelectedDevice } from "@reducer/device.reducer/device.reducer"; import { useEffect, useState } from "react"; export const useDeviceTableViewModel = (searchRef) => { diff --git a/react-ui/src/components/view_model/device.viewmodel.ts b/react-ui/src/components/view_model/device.viewmodel.ts index ec75927f0..6dd01d07e 100644 --- a/react-ui/src/components/view_model/device.viewmodel.ts +++ b/react-ui/src/components/view_model/device.viewmodel.ts @@ -1,5 +1,5 @@ import { useAppDispatch, useAppSelector } from "@hooks"; -import { setActiveTab as setActiveTabState } from "@reducer/device.reducer"; +import { setActiveTab as setActiveTabState } from "@reducer/device.reducer/device.reducer"; import { DeviceViewTabValues } from "@view/device/device.view.tabs"; export const useDeviceViewModel = () => { diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index a2ddc81a9..dddcf5c07 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,5 +1,5 @@ import React from 'react' -import ReactDOM, { Container } from 'react-dom/client' +import ReactDOM from 'react-dom/client' import { RouterProvider } from 'react-router-dom' @@ -12,8 +12,8 @@ import { ToastContainer } from 'react-toastify' import { PersistGate } from 'redux-persist/integration/react' import './i18n/config' import { router } from './routes' +import './shared/icons/icons' import { persistor, store } from './stores' -import './utils/icons/icons' const installToastify = () => { return ( @@ -34,4 +34,3 @@ ReactDOM.createRoot(document.getElementById("root")).render( </React.StrictMode> ); -import './components/subscriptions' \ No newline at end of file diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx index b273246d9..a63d6d875 100644 --- a/react-ui/src/routes.tsx +++ b/react-ui/src/routes.tsx @@ -1,8 +1,8 @@ -import { BasicLayout } from "@layout/basic.layout" -import { LoginLayout } from "@layout/login.layout" -import { ProtectedLayout } from "@layout/protected.layout/protected.layout" -import DeviceView from "@view/device/device.view" -import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom" +import { BasicLayout } from "@layout/basic.layout"; +import { LoginLayout } from "@layout/login.layout"; +import { ProtectedLayout } from "@layout/protected.layout/protected.layout"; +import DeviceView from "@view/device/device.view"; +import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom"; export const DEVICE_URL = '/device/'; export const LOGIN_URL = '/login'; diff --git a/react-ui/src/utils/api/api.ts b/react-ui/src/shared/api/api.ts similarity index 100% rename from react-ui/src/utils/api/api.ts rename to react-ui/src/shared/api/api.ts diff --git a/react-ui/src/utils/helper/coookie.ts b/react-ui/src/shared/helper/coookie.ts similarity index 100% rename from react-ui/src/utils/helper/coookie.ts rename to react-ui/src/shared/helper/coookie.ts diff --git a/react-ui/src/utils/icons/icons.ts b/react-ui/src/shared/icons/icons.ts similarity index 100% rename from react-ui/src/utils/icons/icons.ts rename to react-ui/src/shared/icons/icons.ts diff --git a/react-ui/src/utils/layouts/basic.layout.tsx b/react-ui/src/shared/layouts/basic.layout.tsx similarity index 88% rename from react-ui/src/utils/layouts/basic.layout.tsx rename to react-ui/src/shared/layouts/basic.layout.tsx index 7b7f2b11c..640af3e1b 100644 --- a/react-ui/src/utils/layouts/basic.layout.tsx +++ b/react-ui/src/shared/layouts/basic.layout.tsx @@ -4,11 +4,11 @@ import { useOutlet } from "react-router-dom"; export const BasicLayout = () => { const outlet = useOutlet(); - + return ( <AuthProvider> - {outlet} + {outlet} </AuthProvider> ) } \ No newline at end of file diff --git a/react-ui/src/utils/layouts/login.layout.tsx b/react-ui/src/shared/layouts/login.layout.tsx similarity index 100% rename from react-ui/src/utils/layouts/login.layout.tsx rename to react-ui/src/shared/layouts/login.layout.tsx diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss similarity index 100% rename from react-ui/src/utils/layouts/protected.layout/protected.layout.scss rename to react-ui/src/shared/layouts/protected.layout/protected.layout.scss diff --git a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx similarity index 98% rename from react-ui/src/utils/layouts/protected.layout/protected.layout.tsx rename to react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 588491230..faff61c40 100644 --- a/react-ui/src/utils/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -1,16 +1,16 @@ import logo from '@assets/logo.svg'; import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { useAppDispatch, useAppSelector } from '@hooks'; import { useAuth } from "@provider/auth.provider"; +import { fetchPnds } from '@reducer/device.reducer/device.reducer'; +import { fetchUser } from '@reducer/user.reducer'; +import { DEVICE_URL, LOGIN_URL } from '@routes'; import React, { useEffect } from "react"; import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Link, Outlet, useNavigate } from "react-router-dom"; import "./protected.layout.scss"; -import { useAppDispatch, useAppSelector } from '@hooks'; -import { fetchUser } from '@reducer/user.reducer'; -import { fetchPnds } from '@reducer/device.reducer'; -import { DEVICE_URL, LOGIN_URL } from '@routes'; export const ProtectedLayout = () => { diff --git a/react-ui/src/utils/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx similarity index 100% rename from react-ui/src/utils/provider/auth.provider.tsx rename to react-ui/src/shared/provider/auth.provider.tsx diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts new file mode 100644 index 000000000..c86e30d4a --- /dev/null +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -0,0 +1,88 @@ +import { fetchSelectedMneThunk } from '@reducer/device.reducer/mne.subscription'; +import { AsyncThunk } from '@reduxjs/toolkit'; +import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; +import { fetchDevicesThunk } from '@routine/device.routine'; + +type Routine = QueryActionCreatorResult<any>; + +interface Entity { + routine: Routine, + id: number +} + +const initialState = { + routines: [] as Entity[] +} + +export enum THUNK_KEY { + MNE = 'device/fetch', + DEVICE = 'mne/fetch', +} + +export const RoutineDictionary = new Map<THUNK_KEY,AsyncThunk<any, any, {}>>([ + [THUNK_KEY.DEVICE, fetchDevicesThunk], + [THUNK_KEY.MNE, fetchSelectedMneThunk] +]) + + +/** + * Routine manager is a singleton that holds all running routines. + * The redux store holds any persistable information about the routines. + * The routines objects itself are stored in the RoutineManager. + */ +export const RoutineManager = (() => { + let state = initialState; + const add = (routine: Routine): number => { + const id = state.routines.length; + + const newEntity: Entity = { + routine: routine, + id + } + + state.routines = [...state.routines, newEntity]; + + return id; + } + + + const unsubscribeAll = () => { + state.routines.forEach(({ routine: subscription }) => { + _unsubscribe(subscription) + }); + + state.routines = initialState.routines; + } + + /** + * @param id + * @returns returns true if the routine was stopped, false if it was not found + */ + const unsubscribe = (id: number): boolean => { + const routine = state.routines.find(({ id: routineId }) => routineId === id); + + if (routine) { + _unsubscribe(routine.routine); + } + + return !!routine; + } + + /** + * Actual unsubscribe process. + * This process is extracted to have a single process of unsubscribing. + * + * @param subscription + */ + const _unsubscribe = (subscription: Routine) => { + subscription.unsubscribe(); + // TODO remove from state + } + + + return { + add, + unsubscribe, + unsubscribeAll + } +})(); \ No newline at end of file diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index 8d2be362f..1b3c3335e 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,6 +1,6 @@ import { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' -import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@subscription/action.subscription' +import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@routine/action.routine' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' import persistStore from 'redux-persist/es/persistStore' import { emptySplitApi } from './api.store' @@ -14,7 +14,7 @@ export const store = configureStore({ middleware: (getDefaultMiddleware) => getDefaultMiddleware({ serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, FETCH_DEVICE_ACTION + '/fulfilled', FETCH_MNE_ACTION + '/fulfilled'], + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, FETCH_DEVICE_ACTION + '/fulfilled', FETCH_MNE_ACTION + '/fulfilled', 'routine/addRoutine'], }, }).prepend(listenerMiddleware.middleware).concat(emptySplitApi.middleware, rtkQueryErrorLogger), }) diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index f14de1bd7..65ade7d3e 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,5 +1,5 @@ -import deviceReducer from "@reducer/device.reducer"; -import subscriptionReducer from "@reducer/subscription.reducer"; +import deviceReducer from "@reducer/device.reducer/device.reducer"; +import routineReducer from "@reducer/routine.reducer"; import userReducer from "@reducer/user.reducer"; import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; @@ -18,7 +18,7 @@ const rootPersistConfig = { const rootReducer = combineReducers({ user: userReducer, device: deviceReducer, - subscription: subscriptionReducer, + routine: routineReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/src/stores/reducer/device.reducer.ts b/react-ui/src/stores/reducer/device.reducer/device.reducer.ts similarity index 97% rename from react-ui/src/stores/reducer/device.reducer.ts rename to react-ui/src/stores/reducer/device.reducer/device.reducer.ts index 5919062d2..9f21bcbeb 100644 --- a/react-ui/src/stores/reducer/device.reducer.ts +++ b/react-ui/src/stores/reducer/device.reducer/device.reducer.ts @@ -1,7 +1,6 @@ import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { DeviceViewTabValues } from '@view/device/device.view.tabs'; -import { startListening } from '../middleware/listener.middleware'; export type Device = NetworkelementFlattenedManagedNetworkElement; diff --git a/react-ui/src/components/subscriptions/mne.subscription.ts b/react-ui/src/stores/reducer/device.reducer/mne.subscription.ts similarity index 75% rename from react-ui/src/components/subscriptions/mne.subscription.ts rename to react-ui/src/stores/reducer/device.reducer/mne.subscription.ts index b2b036007..d84e7c5a5 100644 --- a/react-ui/src/components/subscriptions/mne.subscription.ts +++ b/react-ui/src/stores/reducer/device.reducer/mne.subscription.ts @@ -1,17 +1,17 @@ import { api, NetworkElementServiceGetApiArg } from "@api/api"; -import { Device, setSelectedDevice, setSelectedMne } from "@reducer/device.reducer"; -import { CATEGORIES, triggerSubscription } from "@reducer/subscription.reducer"; +import { Device, setSelectedDevice, setSelectedMne } from "@reducer/device.reducer/device.reducer"; +import { addRoutine, CATEGORIES } from "@reducer/routine.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; +import { THUNK_KEY } from "@utils/routine.manager"; import { RootState } from "src/stores"; -import { THUNK_TYPE } from "."; -import { startListening } from "../../../src/stores/middleware/listener.middleware"; -import { FETCH_MNE_ACTION } from "./action.subscription"; +import { FETCH_MNE_ACTION } from "../../../components/routines/action.routine"; +import { startListening } from "../../middleware/listener.middleware"; // fetch mne if selected device is set startListening({ predicate: (action) => setSelectedDevice.match(action) && !!action.payload, effect: async (action, listenerApi) => { - listenerApi.dispatch(triggerSubscription({category: CATEGORIES.TAB, thunkType: THUNK_TYPE.MNE, payload: action.payload})); + listenerApi.dispatch(addRoutine({category: CATEGORIES.TAB, thunkKey: THUNK_KEY.MNE, payload: action.payload})); }, }) diff --git a/react-ui/src/stores/reducer/subscription.reducer.ts b/react-ui/src/stores/reducer/routine.reducer.ts similarity index 51% rename from react-ui/src/stores/reducer/subscription.reducer.ts rename to react-ui/src/stores/reducer/routine.reducer.ts index 344b42d25..85ddd7b2b 100644 --- a/react-ui/src/stores/reducer/subscription.reducer.ts +++ b/react-ui/src/stores/reducer/routine.reducer.ts @@ -1,14 +1,14 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { SubscriptionThunks, THUNK_TYPE } from '@subscription/index'; +import { RoutineDictionary, RoutineManager, THUNK_KEY } from '@utils/routine.manager'; +import { REHYDRATE } from 'redux-persist'; import { RootState } from '..'; -import { SubscriptionHandler } from '../../utils/api/subscription.handler'; import { startListening } from '../middleware/listener.middleware'; import { setToken } from './user.reducer'; interface ThunkEntityDTO { - thunkType: THUNK_TYPE, + thunkKey: THUNK_KEY, payload: any /** @@ -19,11 +19,11 @@ interface ThunkEntityDTO { interface ThunkEntity extends ThunkEntityDTO { id?: number, - locked: boolean + locked: boolean, } -export interface SubscriptionReducerState { +export interface ReducerState { thunks: {[key in keyof typeof CATEGORIES]: ThunkEntity | null} } @@ -32,18 +32,18 @@ export enum CATEGORIES { TAB } -const initialState: SubscriptionReducerState = { +const initialState: ReducerState = { thunks: { TABLE: null, TAB: null } } -const SubscriptionSlice = createSlice({ - name: 'subscription', +const RoutineSlice = createSlice({ + name: 'routine', initialState, reducers: { - triggerSubscription: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { + addRoutine: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { const newThunk: ThunkEntity = {...payload, locked: true}; state.thunks[CATEGORIES[payload.category]] = newThunk; }, @@ -60,51 +60,67 @@ const SubscriptionSlice = createSlice({ }, removeAll: (state) => { - SubscriptionHandler.unsubscribeAll() + RoutineManager.unsubscribeAll() state.thunks = initialState.thunks; }, }, }) -export const { triggerSubscription } = SubscriptionSlice.actions +export const { addRoutine } = RoutineSlice.actions -// on logout remove all subscriptions +// on logout remove all routine startListening({ predicate: (action) => setToken.match(action) && action.payload.token === null, effect: async (_, listenerApi) => { - listenerApi.dispatch(SubscriptionSlice.actions.removeAll()); + listenerApi.dispatch(RoutineSlice.actions.removeAll()); }, }) +// on rehydrate add all persistet routines +startListening({ + predicate: ({type}) => type === REHYDRATE, + effect: async (_, listenerApi) => { + const {routine} = listenerApi.getState() as RootState; + for (const [_,thunk] of Object.entries<ThunkEntity>(routine.thunks)) { + if (!thunk) { + return; + } + + const dto: ThunkEntityDTO = thunk; + listenerApi.dispatch(addRoutine(dto)); + } + }, +}) -// unsubscribe old subscription +// unsubscribe old routine startListening({ - predicate: (action) => triggerSubscription.match(action), + predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const {subscription} = listenerApi.getOriginalState() as RootState; - const lastThunk = subscription.thunks[CATEGORIES[action.payload.category]]; - SubscriptionHandler.unsubscribe(lastThunk.id); + const {routine} = listenerApi.getOriginalState() as RootState; + const lastThunk = routine.thunks[CATEGORIES[action.payload.category]]; + if (lastThunk) { + RoutineManager.unsubscribe(lastThunk.id); + } }, }) -// add new subscription +// add new routine startListening({ - predicate: (action) => triggerSubscription.match(action), + predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const {thunkType} = action.payload as ThunkEntity; + const {thunkKey} = action.payload as ThunkEntity; - const {thunkFn} = SubscriptionThunks.find(({type}) => type === thunkType); + const thunkFn = RoutineDictionary.get(thunkKey); if (!thunkFn) { // TODO throw new Error('Thunk not found'); } const subscription = await listenerApi.dispatch(thunkFn(action.payload.payload)); - const thunkId = await SubscriptionHandler.add(subscription.payload); - listenerApi.dispatch(SubscriptionSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); - + const thunkId = await RoutineManager.add(subscription.payload); + listenerApi.dispatch(RoutineSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); }, }) -export default SubscriptionSlice.reducer +export default RoutineSlice.reducer diff --git a/react-ui/src/utils/api/subscription.handler.ts b/react-ui/src/utils/api/subscription.handler.ts deleted file mode 100644 index e065879f0..000000000 --- a/react-ui/src/utils/api/subscription.handler.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; - -type Subscription = QueryActionCreatorResult<any>; - -interface Entity { - subscription: Subscription, - id: number -} - - -const initialState = { - subscriptions: [] as Entity[] -} - -export const SubscriptionHandler = (() => { - let state = initialState; - const add = (subscription: Subscription): number => { - const id = state.subscriptions.length; - - const subscriptionEntity: Entity = { - subscription, - id - } - - state.subscriptions = [...state.subscriptions, subscriptionEntity]; - - return id; - } - - - const unsubscribeAll = () => { - state.subscriptions.forEach(({ subscription }) => { - unsubscribeAction(subscription) - }); - - state.subscriptions = initialState.subscriptions; - } - - /** - * @param id - * @returns returns true if the subscription was stopped, false if it was not found - */ - const unsubscribe = (id: number): boolean => { - const subscription = state.subscriptions.find(({ id: subscriptionId }) => subscriptionId === id); - - if (subscription) { - unsubscribeAction(subscription.subscription); - } - - return !!subscription; - } - - /** - * Actual unsubscribe action - * - * @param subscription - */ - const unsubscribeAction = (subscription: Subscription) => { - subscription.unsubscribe(); - } - - - return { - add, - unsubscribe, - unsubscribeAll - } -})(); \ No newline at end of file diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 41c9c8f66..6bd0a18b7 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -23,17 +23,18 @@ "baseUrl": ".", "paths": { "@assets/*": ["assets/*"], - "@api/*": ["src/utils/api/*"], + "@api/*": ["src/shared/api/*"], "@viewmodel/*": ["src/components/view_model/*"], "@view/*": ["src/components/view/*"], "@reducer/*": ["src/stores/reducer/*"], - "@provider/*": ["src/utils/provider/*"], - "@layout/*": ["src/utils/layouts/*"], + "@provider/*": ["src/shared/provider/*"], + "@layout/*": ["src/shared/layouts/*"], "@hooks": ["src/hooks"], "@routes": ["src/routes.tsx"], - "@task/*": ["src/utils/tasks/*"], - "@helper/*": ["src/utils/helper/*"], - "@subscription/*": ["src/components/subscriptions/*"] + "@task/*": ["src/shared/tasks/*"], + "@helper/*": ["src/shared/helper/*"], + "@routine/*": ["src/components/routines/*"], + "@utils/*": ["src/shared/utils/*"] } }, "include": [ diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 96be1c844..d36e8cf3a 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -36,17 +36,18 @@ export default defineConfig({ resolve: { alias: { '@assets': '/assets', - '@api': '/src/utils/api', + '@api': '/src/shared/api', '@viewmodel': '/src/components/view_model', '@view': '/src/components/view', '@reducer': '/src/stores/reducer', - '@provider': '/src/utils/provider', - '@layout': '/src/utils/layouts', + '@provider': '/src/shared/provider', + '@layout': '/src/shared/layouts', '@hooks': '/src/hooks.ts', - '@task': '/src/utils/tasks', - '@helper': '/src/utils/helper', + '@task': '/src/shared/tasks', + '@helper': '/src/shared/helper', '@routes': '/src/routes.tsx', - '@subscription': '/src/components/subscriptions', + '@routine': '/src/components/routines', + '@utils': '/src/shared/utils', }, }, -- GitLab From bb8e573bdce004977aa7d78a9fe4a2487337b29c Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 1 Oct 2024 13:11:05 +0200 Subject: [PATCH 28/78] refactor login to component --- .../login}/layouts/login.layout.tsx | 2 +- .../{view/login => login/view}/login.scss | 0 .../{view/login => login/view}/login.view.tsx | 2 +- .../viewmodel}/login.viewmodel.ts | 0 .../src/components/routines/device.routine.ts | 2 +- react-ui/src/components/view/device/device.scss | 15 ++++++--------- .../components/view/device/device.view.table.tsx | 2 +- .../src/components/view/device/device.view.tsx | 2 +- react-ui/src/index.scss | 11 +++++------ react-ui/src/routes.tsx | 4 ++-- .../protected.layout/protected.layout.scss | 6 +++--- .../layouts/protected.layout/protected.layout.tsx | 2 +- react-ui/src/shared/provider/auth.provider.tsx | 2 +- .../reducer => shared/store}/user.reducer.ts | 0 react-ui/src/{ => shared}/style/box.scss | 0 react-ui/src/{ => shared}/style/colors.scss | 0 react-ui/src/{ => shared}/style/fonts.scss | 0 react-ui/src/{ => shared}/style/index.scss | 0 react-ui/src/{ => shared}/style/toast.scss | 0 react-ui/src/{ => shared}/style/utils.scss | 0 react-ui/src/shared/utils/routine.manager.ts | 2 +- react-ui/src/stores/index.ts | 2 +- react-ui/src/stores/persist.store.ts | 2 +- .../reducer/device.reducer/device.reducer.ts | 2 +- react-ui/src/stores/reducer/routine.reducer.ts | 2 +- react-ui/tsconfig.json | 7 +++---- react-ui/vite.config.mjs | 5 ++--- 27 files changed, 33 insertions(+), 39 deletions(-) rename react-ui/src/{shared => components/login}/layouts/login.layout.tsx (92%) rename react-ui/src/components/{view/login => login/view}/login.scss (100%) rename react-ui/src/components/{view/login => login/view}/login.view.tsx (98%) rename react-ui/src/components/{view_model => login/viewmodel}/login.viewmodel.ts (100%) rename react-ui/src/{stores/reducer => shared/store}/user.reducer.ts (100%) rename react-ui/src/{ => shared}/style/box.scss (100%) rename react-ui/src/{ => shared}/style/colors.scss (100%) rename react-ui/src/{ => shared}/style/fonts.scss (100%) rename react-ui/src/{ => shared}/style/index.scss (100%) rename react-ui/src/{ => shared}/style/toast.scss (100%) rename react-ui/src/{ => shared}/style/utils.scss (100%) diff --git a/react-ui/src/shared/layouts/login.layout.tsx b/react-ui/src/components/login/layouts/login.layout.tsx similarity index 92% rename from react-ui/src/shared/layouts/login.layout.tsx rename to react-ui/src/components/login/layouts/login.layout.tsx index 43e40aa30..323941a67 100644 --- a/react-ui/src/shared/layouts/login.layout.tsx +++ b/react-ui/src/components/login/layouts/login.layout.tsx @@ -1,7 +1,7 @@ import { useAuth } from "@provider/auth.provider"; -import LoginView from "@view/login/login.view"; import { useEffect } from "react"; import { useNavigate, useOutlet } from "react-router-dom"; +import LoginView from "../view/login.view"; export const LoginLayout = ({ children }) => { diff --git a/react-ui/src/components/view/login/login.scss b/react-ui/src/components/login/view/login.scss similarity index 100% rename from react-ui/src/components/view/login/login.scss rename to react-ui/src/components/login/view/login.scss diff --git a/react-ui/src/components/view/login/login.view.tsx b/react-ui/src/components/login/view/login.view.tsx similarity index 98% rename from react-ui/src/components/view/login/login.view.tsx rename to react-ui/src/components/login/view/login.view.tsx index 405a42f84..0db0ea206 100644 --- a/react-ui/src/components/view/login/login.view.tsx +++ b/react-ui/src/components/login/view/login.view.tsx @@ -3,8 +3,8 @@ import { useTranslation } from 'react-i18next' import './login.scss' import logo from '@assets/logo.svg' -import useLoginViewModel from '@viewmodel/login.viewmodel' import React, { useRef } from 'react' +import useLoginViewModel from '../viewmodel/login.viewmodel' const LoginView = ({ children }) => { const { t } = useTranslation('common') diff --git a/react-ui/src/components/view_model/login.viewmodel.ts b/react-ui/src/components/login/viewmodel/login.viewmodel.ts similarity index 100% rename from react-ui/src/components/view_model/login.viewmodel.ts rename to react-ui/src/components/login/viewmodel/login.viewmodel.ts diff --git a/react-ui/src/components/routines/device.routine.ts b/react-ui/src/components/routines/device.routine.ts index 0290f637d..7cafd91b7 100644 --- a/react-ui/src/components/routines/device.routine.ts +++ b/react-ui/src/components/routines/device.routine.ts @@ -1,7 +1,7 @@ import { NetworkElementServiceGetAllFlattenedApiArg, api } from "@api/api"; import { setDevices } from "@reducer/device.reducer/device.reducer"; -import { setUser } from "@reducer/user.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; +import { setUser } from "@shared/store/user.reducer"; import { RootState } from "src/stores"; import { startListening } from "../../stores/middleware/listener.middleware"; import { FETCH_DEVICE_ACTION } from "./action.routine"; diff --git a/react-ui/src/components/view/device/device.scss b/react-ui/src/components/view/device/device.scss index d24b08084..0890fc928 100644 --- a/react-ui/src/components/view/device/device.scss +++ b/react-ui/src/components/view/device/device.scss @@ -1,25 +1,22 @@ -@import '../../../style/colors.scss'; +@import '/src/shared/style/colors.scss'; thead { font-size: 0.9em; } -tr:hover > td { +tr:hover > td { background-color: lighten(map-get($theme-colors, primary), 30%) !important; } -tr:nth-child(2n+1) > td { - background-color: lighten(map-get($theme-colors, primary) , 38%) +tr:nth-child(2n + 1) > td { + background-color: lighten(map-get($theme-colors, primary), 38%); } .c-box { padding: 2em !important; padding-top: 1em !important; - } - - .border-right { $border-padding: 2em; @@ -39,7 +36,7 @@ tr:nth-child(2n+1) > td { &:hover { color: lighten(map-get($theme-colors, primary), 10%); } - + &:focus { border: none !important; color: lighten(map-get($theme-colors, primary), 10%); @@ -49,4 +46,4 @@ tr:nth-child(2n+1) > td { color: map-get($theme-colors, primary); font-weight: 500; } -} \ No newline at end of file +} diff --git a/react-ui/src/components/view/device/device.view.table.tsx b/react-ui/src/components/view/device/device.view.table.tsx index 17d4bfd25..16c9c7730 100644 --- a/react-ui/src/components/view/device/device.view.table.tsx +++ b/react-ui/src/components/view/device/device.view.table.tsx @@ -1,8 +1,8 @@ import { useAppSelector } from "@hooks"; -import { useDeviceTableViewModel } from "@viewmodel/device.table.viewmodel"; import { MutableRefObject, useCallback } from "react"; import { OverlayTrigger, Table, Tooltip } from "react-bootstrap"; import { useTranslation } from "react-i18next"; +import { useDeviceTableViewModel } from "../../view_model/device.table.viewmodel"; export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { const { devices, pnds } = useAppSelector(state => state.device); diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/view/device/device.view.tsx index c85ce6be6..c620636bf 100644 --- a/react-ui/src/components/view/device/device.view.tsx +++ b/react-ui/src/components/view/device/device.view.tsx @@ -1,10 +1,10 @@ -import { useDeviceViewModel } from '@viewmodel/device.viewmodel'; import { useRef } from 'react'; import { Button, Col, Container, Form, Nav, NavLink, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; import './device.scss'; import { DeviceViewTable } from './device.view.table'; import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; +import { useDeviceViewModel } from '/src/components/view_model/device.viewmodel'; function DeviceView() { const { t } = useTranslation('common'); diff --git a/react-ui/src/index.scss b/react-ui/src/index.scss index 3526e18bc..8dd280e64 100644 --- a/react-ui/src/index.scss +++ b/react-ui/src/index.scss @@ -1,10 +1,9 @@ -@import './style/index.scss'; +@import './shared/style/index.scss'; body { - margin: 0; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + margin: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; - - background-color: map-get($theme-colors, bg-primary) !important; + background-color: map-get($theme-colors, bg-primary) !important; } diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx index a63d6d875..1015d87af 100644 --- a/react-ui/src/routes.tsx +++ b/react-ui/src/routes.tsx @@ -1,8 +1,8 @@ import { BasicLayout } from "@layout/basic.layout"; -import { LoginLayout } from "@layout/login.layout"; import { ProtectedLayout } from "@layout/protected.layout/protected.layout"; -import DeviceView from "@view/device/device.view"; import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom"; +import { LoginLayout } from "./components/login/layouts/login.layout"; +import DeviceView from "./components/view/device/device.view"; export const DEVICE_URL = '/device/'; export const LOGIN_URL = '/login'; diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss index 47561615d..ffc4acf0d 100644 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss @@ -1,4 +1,4 @@ -@import "/src/style/colors.scss"; +@import '/src/shared/style/colors.scss'; $sidebar-width: 4.5em; @@ -12,7 +12,7 @@ $sidebar-width: 4.5em; color: map-get($theme-colors, primary); font-weight: 600; } - + &.active { color: map-get($theme-colors, primary); font-weight: 600; @@ -26,4 +26,4 @@ $sidebar-width: 4.5em; .main-content { margin-left: $sidebar-width; -} \ No newline at end of file +} diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index faff61c40..020389984 100644 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -4,8 +4,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useAppDispatch, useAppSelector } from '@hooks'; import { useAuth } from "@provider/auth.provider"; import { fetchPnds } from '@reducer/device.reducer/device.reducer'; -import { fetchUser } from '@reducer/user.reducer'; import { DEVICE_URL, LOGIN_URL } from '@routes'; +import { fetchUser } from '@shared/store/user.reducer'; import React, { useEffect } from "react"; import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; diff --git a/react-ui/src/shared/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx index d1f472cc7..b6bde9262 100644 --- a/react-ui/src/shared/provider/auth.provider.tsx +++ b/react-ui/src/shared/provider/auth.provider.tsx @@ -1,11 +1,11 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; import { getCookieValue } from "@helper/coookie"; import { useAppDispatch, useAppSelector } from "@hooks"; -import { setToken } from "@reducer/user.reducer"; import { DEVICE_URL, LOGIN_URL } from "@routes"; import { jwtDecode } from "jwt-decode"; import { createContext, useContext, useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; +import { setToken } from "../store/user.reducer"; interface AuthProviderType { login: (username: string, password: string) => void, diff --git a/react-ui/src/stores/reducer/user.reducer.ts b/react-ui/src/shared/store/user.reducer.ts similarity index 100% rename from react-ui/src/stores/reducer/user.reducer.ts rename to react-ui/src/shared/store/user.reducer.ts diff --git a/react-ui/src/style/box.scss b/react-ui/src/shared/style/box.scss similarity index 100% rename from react-ui/src/style/box.scss rename to react-ui/src/shared/style/box.scss diff --git a/react-ui/src/style/colors.scss b/react-ui/src/shared/style/colors.scss similarity index 100% rename from react-ui/src/style/colors.scss rename to react-ui/src/shared/style/colors.scss diff --git a/react-ui/src/style/fonts.scss b/react-ui/src/shared/style/fonts.scss similarity index 100% rename from react-ui/src/style/fonts.scss rename to react-ui/src/shared/style/fonts.scss diff --git a/react-ui/src/style/index.scss b/react-ui/src/shared/style/index.scss similarity index 100% rename from react-ui/src/style/index.scss rename to react-ui/src/shared/style/index.scss diff --git a/react-ui/src/style/toast.scss b/react-ui/src/shared/style/toast.scss similarity index 100% rename from react-ui/src/style/toast.scss rename to react-ui/src/shared/style/toast.scss diff --git a/react-ui/src/style/utils.scss b/react-ui/src/shared/style/utils.scss similarity index 100% rename from react-ui/src/style/utils.scss rename to react-ui/src/shared/style/utils.scss diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index c86e30d4a..449e2c690 100644 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -1,7 +1,7 @@ +import { fetchDevicesThunk } from '@component/routines/device.routine'; import { fetchSelectedMneThunk } from '@reducer/device.reducer/mne.subscription'; import { AsyncThunk } from '@reduxjs/toolkit'; import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; -import { fetchDevicesThunk } from '@routine/device.routine'; type Routine = QueryActionCreatorResult<any>; diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index 1b3c3335e..f620923b5 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,12 +1,12 @@ import { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' -import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@routine/action.routine' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' import persistStore from 'redux-persist/es/persistStore' import { emptySplitApi } from './api.store' import { rtkQueryErrorLogger } from './middleware/devLogging.middleware' import { listenerMiddleware } from './middleware/listener.middleware' import persistedReducer from './persist.store' +import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '/src/components/routines/action.routine' export const store = configureStore({ diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index 65ade7d3e..d66bcf930 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,10 +1,10 @@ import deviceReducer from "@reducer/device.reducer/device.reducer"; import routineReducer from "@reducer/routine.reducer"; -import userReducer from "@reducer/user.reducer"; import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; import storage from "redux-persist/es/storage"; import { emptySplitApi } from "./api.store"; +import userReducer from "/src/shared/store/user.reducer"; /** local storage config */ diff --git a/react-ui/src/stores/reducer/device.reducer/device.reducer.ts b/react-ui/src/stores/reducer/device.reducer/device.reducer.ts index 9f21bcbeb..c9388adc5 100644 --- a/react-ui/src/stores/reducer/device.reducer/device.reducer.ts +++ b/react-ui/src/stores/reducer/device.reducer/device.reducer.ts @@ -1,6 +1,6 @@ import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; +import { DeviceViewTabValues } from '@component/view/device/device.view.tabs'; import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { DeviceViewTabValues } from '@view/device/device.view.tabs'; export type Device = NetworkelementFlattenedManagedNetworkElement; diff --git a/react-ui/src/stores/reducer/routine.reducer.ts b/react-ui/src/stores/reducer/routine.reducer.ts index 85ddd7b2b..79e7c8683 100644 --- a/react-ui/src/stores/reducer/routine.reducer.ts +++ b/react-ui/src/stores/reducer/routine.reducer.ts @@ -1,9 +1,9 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { setToken } from '@shared/store/user.reducer'; import { RoutineDictionary, RoutineManager, THUNK_KEY } from '@utils/routine.manager'; import { REHYDRATE } from 'redux-persist'; import { RootState } from '..'; import { startListening } from '../middleware/listener.middleware'; -import { setToken } from './user.reducer'; diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 6bd0a18b7..6cfd61712 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -24,8 +24,6 @@ "paths": { "@assets/*": ["assets/*"], "@api/*": ["src/shared/api/*"], - "@viewmodel/*": ["src/components/view_model/*"], - "@view/*": ["src/components/view/*"], "@reducer/*": ["src/stores/reducer/*"], "@provider/*": ["src/shared/provider/*"], "@layout/*": ["src/shared/layouts/*"], @@ -33,8 +31,9 @@ "@routes": ["src/routes.tsx"], "@task/*": ["src/shared/tasks/*"], "@helper/*": ["src/shared/helper/*"], - "@routine/*": ["src/components/routines/*"], - "@utils/*": ["src/shared/utils/*"] + "@utils/*": ["src/shared/utils/*"], + "@shared/*": ["src/shared/*"], + "@component/*": ["src/components/*"] } }, "include": [ diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index d36e8cf3a..bdff7502a 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -37,8 +37,6 @@ export default defineConfig({ alias: { '@assets': '/assets', '@api': '/src/shared/api', - '@viewmodel': '/src/components/view_model', - '@view': '/src/components/view', '@reducer': '/src/stores/reducer', '@provider': '/src/shared/provider', '@layout': '/src/shared/layouts', @@ -46,8 +44,9 @@ export default defineConfig({ '@task': '/src/shared/tasks', '@helper': '/src/shared/helper', '@routes': '/src/routes.tsx', - '@routine': '/src/components/routines', '@utils': '/src/shared/utils', + '@shared': '/src/shared', + '@component': '/src/components', }, }, -- GitLab From e8c66bcae80b7d4e971445722efd3cc15284147b Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 1 Oct 2024 13:23:28 +0200 Subject: [PATCH 29/78] refactor device to component --- .../devices/reducer}/device.reducer.ts | 2 +- .../devices/reducer}/mne.subscription.ts | 8 ++++---- .../components/{ => devices}/routines/action.routine.ts | 0 .../components/{ => devices}/routines/device.routine.ts | 6 +++--- .../components/{view/device => devices/view}/device.scss | 0 .../{view/device => devices/view}/device.view.table.tsx | 2 +- .../{view/device => devices/view}/device.view.tabs.tsx | 0 .../{view/device => devices/view}/device.view.tsx | 2 +- .../{ => devices}/view_model/device.table.viewmodel.ts | 2 +- .../{ => devices}/view_model/device.viewmodel.ts | 2 +- react-ui/src/routes.tsx | 2 +- .../shared/layouts/protected.layout/protected.layout.tsx | 4 ++-- react-ui/src/shared/provider/auth.provider.tsx | 2 +- .../src/{stores => shared}/reducer/routine.reducer.ts | 7 +++---- react-ui/src/shared/{store => reducer}/user.reducer.ts | 0 react-ui/src/shared/utils/routine.manager.ts | 4 ++-- react-ui/src/stores/index.ts | 2 +- react-ui/src/stores/persist.store.ts | 6 +++--- 18 files changed, 25 insertions(+), 26 deletions(-) rename react-ui/src/{stores/reducer/device.reducer => components/devices/reducer}/device.reducer.ts (96%) rename react-ui/src/{stores/reducer/device.reducer => components/devices/reducer}/mne.subscription.ts (81%) rename react-ui/src/components/{ => devices}/routines/action.routine.ts (100%) rename react-ui/src/components/{ => devices}/routines/device.routine.ts (86%) rename react-ui/src/components/{view/device => devices/view}/device.scss (100%) rename react-ui/src/components/{view/device => devices/view}/device.view.table.tsx (96%) rename react-ui/src/components/{view/device => devices/view}/device.view.tabs.tsx (100%) rename react-ui/src/components/{view/device => devices/view}/device.view.tsx (96%) rename react-ui/src/components/{ => devices}/view_model/device.table.viewmodel.ts (91%) rename react-ui/src/components/{ => devices}/view_model/device.viewmodel.ts (86%) rename react-ui/src/{stores => shared}/reducer/routine.reducer.ts (95%) rename react-ui/src/shared/{store => reducer}/user.reducer.ts (100%) diff --git a/react-ui/src/stores/reducer/device.reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts similarity index 96% rename from react-ui/src/stores/reducer/device.reducer/device.reducer.ts rename to react-ui/src/components/devices/reducer/device.reducer.ts index c9388adc5..ad702310b 100644 --- a/react-ui/src/stores/reducer/device.reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -1,5 +1,5 @@ import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; -import { DeviceViewTabValues } from '@component/view/device/device.view.tabs'; +import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs'; import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; export type Device = NetworkelementFlattenedManagedNetworkElement; diff --git a/react-ui/src/stores/reducer/device.reducer/mne.subscription.ts b/react-ui/src/components/devices/reducer/mne.subscription.ts similarity index 81% rename from react-ui/src/stores/reducer/device.reducer/mne.subscription.ts rename to react-ui/src/components/devices/reducer/mne.subscription.ts index d84e7c5a5..fec8a0b21 100644 --- a/react-ui/src/stores/reducer/device.reducer/mne.subscription.ts +++ b/react-ui/src/components/devices/reducer/mne.subscription.ts @@ -1,11 +1,11 @@ import { api, NetworkElementServiceGetApiArg } from "@api/api"; -import { Device, setSelectedDevice, setSelectedMne } from "@reducer/device.reducer/device.reducer"; -import { addRoutine, CATEGORIES } from "@reducer/routine.reducer"; +import { Device, setSelectedDevice, setSelectedMne } from "@component/devices/reducer/device.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; +import { addRoutine, CATEGORIES } from "@shared/reducer/routine.reducer"; import { THUNK_KEY } from "@utils/routine.manager"; import { RootState } from "src/stores"; -import { FETCH_MNE_ACTION } from "../../../components/routines/action.routine"; -import { startListening } from "../../middleware/listener.middleware"; +import { startListening } from "../../../stores/middleware/listener.middleware"; +import { FETCH_MNE_ACTION } from "../routines/action.routine"; // fetch mne if selected device is set startListening({ diff --git a/react-ui/src/components/routines/action.routine.ts b/react-ui/src/components/devices/routines/action.routine.ts similarity index 100% rename from react-ui/src/components/routines/action.routine.ts rename to react-ui/src/components/devices/routines/action.routine.ts diff --git a/react-ui/src/components/routines/device.routine.ts b/react-ui/src/components/devices/routines/device.routine.ts similarity index 86% rename from react-ui/src/components/routines/device.routine.ts rename to react-ui/src/components/devices/routines/device.routine.ts index 7cafd91b7..2d14e4bf5 100644 --- a/react-ui/src/components/routines/device.routine.ts +++ b/react-ui/src/components/devices/routines/device.routine.ts @@ -1,9 +1,9 @@ import { NetworkElementServiceGetAllFlattenedApiArg, api } from "@api/api"; -import { setDevices } from "@reducer/device.reducer/device.reducer"; +import { setDevices } from "@component/devices/reducer/device.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; -import { setUser } from "@shared/store/user.reducer"; +import { setUser } from "@shared/reducer/user.reducer"; import { RootState } from "src/stores"; -import { startListening } from "../../stores/middleware/listener.middleware"; +import { startListening } from "../../../stores/middleware/listener.middleware"; import { FETCH_DEVICE_ACTION } from "./action.routine"; // continously fetch devices diff --git a/react-ui/src/components/view/device/device.scss b/react-ui/src/components/devices/view/device.scss similarity index 100% rename from react-ui/src/components/view/device/device.scss rename to react-ui/src/components/devices/view/device.scss diff --git a/react-ui/src/components/view/device/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx similarity index 96% rename from react-ui/src/components/view/device/device.view.table.tsx rename to react-ui/src/components/devices/view/device.view.table.tsx index 16c9c7730..9ef441f17 100644 --- a/react-ui/src/components/view/device/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -2,7 +2,7 @@ import { useAppSelector } from "@hooks"; import { MutableRefObject, useCallback } from "react"; import { OverlayTrigger, Table, Tooltip } from "react-bootstrap"; import { useTranslation } from "react-i18next"; -import { useDeviceTableViewModel } from "../../view_model/device.table.viewmodel"; +import { useDeviceTableViewModel } from "../view_model/device.table.viewmodel"; export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { const { devices, pnds } = useAppSelector(state => state.device); diff --git a/react-ui/src/components/view/device/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx similarity index 100% rename from react-ui/src/components/view/device/device.view.tabs.tsx rename to react-ui/src/components/devices/view/device.view.tabs.tsx diff --git a/react-ui/src/components/view/device/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx similarity index 96% rename from react-ui/src/components/view/device/device.view.tsx rename to react-ui/src/components/devices/view/device.view.tsx index c620636bf..9e176ae66 100644 --- a/react-ui/src/components/view/device/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,10 +1,10 @@ import { useRef } from 'react'; import { Button, Col, Container, Form, Nav, NavLink, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; +import { useDeviceViewModel } from '../view_model/device.viewmodel'; import './device.scss'; import { DeviceViewTable } from './device.view.table'; import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; -import { useDeviceViewModel } from '/src/components/view_model/device.viewmodel'; function DeviceView() { const { t } = useTranslation('common'); diff --git a/react-ui/src/components/view_model/device.table.viewmodel.ts b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts similarity index 91% rename from react-ui/src/components/view_model/device.table.viewmodel.ts rename to react-ui/src/components/devices/view_model/device.table.viewmodel.ts index 0802d6b57..df7595328 100644 --- a/react-ui/src/components/view_model/device.table.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts @@ -1,5 +1,5 @@ +import { Device, setSelectedDevice } from "@component/devices/reducer/device.reducer"; import { useAppDispatch } from "@hooks"; -import { Device, setSelectedDevice } from "@reducer/device.reducer/device.reducer"; import { useEffect, useState } from "react"; export const useDeviceTableViewModel = (searchRef) => { diff --git a/react-ui/src/components/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts similarity index 86% rename from react-ui/src/components/view_model/device.viewmodel.ts rename to react-ui/src/components/devices/view_model/device.viewmodel.ts index 6dd01d07e..cfff6cf9a 100644 --- a/react-ui/src/components/view_model/device.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.viewmodel.ts @@ -1,5 +1,5 @@ +import { setActiveTab as setActiveTabState } from "@component/devices/reducer/device.reducer"; import { useAppDispatch, useAppSelector } from "@hooks"; -import { setActiveTab as setActiveTabState } from "@reducer/device.reducer/device.reducer"; import { DeviceViewTabValues } from "@view/device/device.view.tabs"; export const useDeviceViewModel = () => { diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx index 1015d87af..368df55a4 100644 --- a/react-ui/src/routes.tsx +++ b/react-ui/src/routes.tsx @@ -1,8 +1,8 @@ import { BasicLayout } from "@layout/basic.layout"; import { ProtectedLayout } from "@layout/protected.layout/protected.layout"; import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom"; +import DeviceView from "./components/devices/view/device.view"; import { LoginLayout } from "./components/login/layouts/login.layout"; -import DeviceView from "./components/view/device/device.view"; export const DEVICE_URL = '/device/'; export const LOGIN_URL = '/login'; diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 020389984..03a188796 100644 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -1,11 +1,11 @@ import logo from '@assets/logo.svg'; +import { fetchPnds } from '@component/devices/reducer/device.reducer'; import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useAppDispatch, useAppSelector } from '@hooks'; import { useAuth } from "@provider/auth.provider"; -import { fetchPnds } from '@reducer/device.reducer/device.reducer'; import { DEVICE_URL, LOGIN_URL } from '@routes'; -import { fetchUser } from '@shared/store/user.reducer'; +import { fetchUser } from '@shared/reducer/user.reducer'; import React, { useEffect } from "react"; import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; diff --git a/react-ui/src/shared/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx index b6bde9262..4098eca5b 100644 --- a/react-ui/src/shared/provider/auth.provider.tsx +++ b/react-ui/src/shared/provider/auth.provider.tsx @@ -5,7 +5,7 @@ import { DEVICE_URL, LOGIN_URL } from "@routes"; import { jwtDecode } from "jwt-decode"; import { createContext, useContext, useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; -import { setToken } from "../store/user.reducer"; +import { setToken } from "../reducer/user.reducer"; interface AuthProviderType { login: (username: string, password: string) => void, diff --git a/react-ui/src/stores/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts similarity index 95% rename from react-ui/src/stores/reducer/routine.reducer.ts rename to react-ui/src/shared/reducer/routine.reducer.ts index 79e7c8683..fb62e5159 100644 --- a/react-ui/src/stores/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,9 +1,9 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { setToken } from '@shared/store/user.reducer'; import { RoutineDictionary, RoutineManager, THUNK_KEY } from '@utils/routine.manager'; import { REHYDRATE } from 'redux-persist'; -import { RootState } from '..'; -import { startListening } from '../middleware/listener.middleware'; +import { RootState } from '../../stores'; +import { startListening } from '../../stores/middleware/listener.middleware'; +import { setToken } from './user.reducer'; @@ -22,7 +22,6 @@ interface ThunkEntity extends ThunkEntityDTO { locked: boolean, } - export interface ReducerState { thunks: {[key in keyof typeof CATEGORIES]: ThunkEntity | null} } diff --git a/react-ui/src/shared/store/user.reducer.ts b/react-ui/src/shared/reducer/user.reducer.ts similarity index 100% rename from react-ui/src/shared/store/user.reducer.ts rename to react-ui/src/shared/reducer/user.reducer.ts diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index 449e2c690..891637fb8 100644 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -1,5 +1,5 @@ -import { fetchDevicesThunk } from '@component/routines/device.routine'; -import { fetchSelectedMneThunk } from '@reducer/device.reducer/mne.subscription'; +import { fetchSelectedMneThunk } from '@component/devices/reducer/mne.subscription'; +import { fetchDevicesThunk } from '@component/devices/routines/device.routine'; import { AsyncThunk } from '@reduxjs/toolkit'; import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index f620923b5..8c24b8763 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,3 +1,4 @@ +import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@component/devices/routines/action.routine' import { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' @@ -6,7 +7,6 @@ import { emptySplitApi } from './api.store' import { rtkQueryErrorLogger } from './middleware/devLogging.middleware' import { listenerMiddleware } from './middleware/listener.middleware' import persistedReducer from './persist.store' -import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '/src/components/routines/action.routine' export const store = configureStore({ diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index d66bcf930..bda77de7e 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,10 +1,10 @@ -import deviceReducer from "@reducer/device.reducer/device.reducer"; -import routineReducer from "@reducer/routine.reducer"; +import deviceReducer from "@component/devices/reducer/device.reducer"; +import routineReducer from "@shared/reducer/routine.reducer"; +import userReducer from "@shared/reducer/user.reducer"; import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; import storage from "redux-persist/es/storage"; import { emptySplitApi } from "./api.store"; -import userReducer from "/src/shared/store/user.reducer"; /** local storage config */ -- GitLab From 33b54c39e930f44fb1bc3e7ac896b92a0212404a Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 7 Oct 2024 08:27:45 +0200 Subject: [PATCH 30/78] refactor device component --- .gitmodules | 3 + react-ui/.gitignore | 1 + react-ui/package.json | 3 +- .../devices/reducer/device.reducer.ts | 2 + .../devices/routines/action.routine.ts | 2 - .../devices/routines/device.routine.ts | 4 +- .../src/components/devices/routines/index.ts | 3 + .../mne.routine.ts} | 7 +- .../components/devices/view/device.view.tsx | 1 - .../src/shared/reducer/routine.reducer.ts | 19 +- react-ui/src/shared/utils/routine.manager.ts | 13 - react-ui/src/stores/index.ts | 4 +- react-ui/yang_model | 1 + react-ui/yarn.lock | 239 +++++++++++++++++- 14 files changed, 262 insertions(+), 40 deletions(-) delete mode 100644 react-ui/src/components/devices/routines/action.routine.ts create mode 100644 react-ui/src/components/devices/routines/index.ts rename react-ui/src/components/devices/{reducer/mne.subscription.ts => routines/mne.routine.ts} (86%) create mode 160000 react-ui/yang_model diff --git a/.gitmodules b/.gitmodules index 31328ccf0..da22de84f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -9,3 +9,6 @@ [submodule "models/YangModels"] path = models/YangModels url = https://github.com/YangModels/yang.git +[submodule "react-ui/yang_model"] + path = react-ui/yang_model + url = https://github.com/openconfig/public.git diff --git a/react-ui/.gitignore b/react-ui/.gitignore index e7d84c03a..6b5757776 100644 --- a/react-ui/.gitignore +++ b/react-ui/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +/yang_model # testing /coverage diff --git a/react-ui/package.json b/react-ui/package.json index 966d60eec..056db6412 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -25,7 +25,8 @@ "redux": "^5.0.1", "redux-observable": "^3.0.0-rc.2", "redux-persist": "^6.0.0", - "web-vitals": "^4.2.2" + "web-vitals": "^4.2.2", + "yang-js": "^0.24.70" }, "scripts": { "start": "vite", diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index ad702310b..7195ceaa1 100644 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -1,6 +1,8 @@ import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs'; import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; +import '../routines/index'; + export type Device = NetworkelementFlattenedManagedNetworkElement; diff --git a/react-ui/src/components/devices/routines/action.routine.ts b/react-ui/src/components/devices/routines/action.routine.ts deleted file mode 100644 index 746e3df36..000000000 --- a/react-ui/src/components/devices/routines/action.routine.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE'; -export const FETCH_DEVICE_ACTION = 'subscription/device/fetchDevices' \ No newline at end of file diff --git a/react-ui/src/components/devices/routines/device.routine.ts b/react-ui/src/components/devices/routines/device.routine.ts index 2d14e4bf5..4eb1b6b18 100644 --- a/react-ui/src/components/devices/routines/device.routine.ts +++ b/react-ui/src/components/devices/routines/device.routine.ts @@ -4,7 +4,8 @@ import { createAsyncThunk } from "@reduxjs/toolkit"; import { setUser } from "@shared/reducer/user.reducer"; import { RootState } from "src/stores"; import { startListening } from "../../../stores/middleware/listener.middleware"; -import { FETCH_DEVICE_ACTION } from "./action.routine"; + +export const FETCH_DEVICE_ACTION = 'subscription/device/fetchDevices' // continously fetch devices const FETCH_DEVICES_INTERVAL = 15000; // in ms @@ -15,6 +16,7 @@ startListening({ }, }) + export const fetchDevicesThunk = createAsyncThunk(FETCH_DEVICE_ACTION, (_, thunkApi) => { const { user } = thunkApi.getState() as RootState; diff --git a/react-ui/src/components/devices/routines/index.ts b/react-ui/src/components/devices/routines/index.ts new file mode 100644 index 000000000..5fd5267a2 --- /dev/null +++ b/react-ui/src/components/devices/routines/index.ts @@ -0,0 +1,3 @@ +import './device.routine'; +import './mne.routine'; + diff --git a/react-ui/src/components/devices/reducer/mne.subscription.ts b/react-ui/src/components/devices/routines/mne.routine.ts similarity index 86% rename from react-ui/src/components/devices/reducer/mne.subscription.ts rename to react-ui/src/components/devices/routines/mne.routine.ts index fec8a0b21..9823aa69a 100644 --- a/react-ui/src/components/devices/reducer/mne.subscription.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -2,16 +2,17 @@ import { api, NetworkElementServiceGetApiArg } from "@api/api"; import { Device, setSelectedDevice, setSelectedMne } from "@component/devices/reducer/device.reducer"; import { createAsyncThunk } from "@reduxjs/toolkit"; import { addRoutine, CATEGORIES } from "@shared/reducer/routine.reducer"; -import { THUNK_KEY } from "@utils/routine.manager"; import { RootState } from "src/stores"; import { startListening } from "../../../stores/middleware/listener.middleware"; -import { FETCH_MNE_ACTION } from "../routines/action.routine"; + +export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE'; + // fetch mne if selected device is set startListening({ predicate: (action) => setSelectedDevice.match(action) && !!action.payload, effect: async (action, listenerApi) => { - listenerApi.dispatch(addRoutine({category: CATEGORIES.TAB, thunkKey: THUNK_KEY.MNE, payload: action.payload})); + listenerApi.dispatch(addRoutine({thunk: fetchSelectedMneThunk, category: CATEGORIES.TAB, payload: action.payload})); }, }) diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 9e176ae66..0d04b959c 100644 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -22,7 +22,6 @@ function DeviceView() { <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> </Nav> </Col> - </Row> <Row className='align-items-center'> diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index fb62e5159..b4008f0fd 100644 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,5 +1,5 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { RoutineDictionary, RoutineManager, THUNK_KEY } from '@utils/routine.manager'; +import { RoutineManager } from '@utils/routine.manager'; import { REHYDRATE } from 'redux-persist'; import { RootState } from '../../stores'; import { startListening } from '../../stores/middleware/listener.middleware'; @@ -8,7 +8,7 @@ import { setToken } from './user.reducer'; interface ThunkEntityDTO { - thunkKey: THUNK_KEY, + thunk: any, payload: any /** @@ -59,7 +59,6 @@ const RoutineSlice = createSlice({ }, removeAll: (state) => { - RoutineManager.unsubscribeAll() state.thunks = initialState.thunks; }, }, @@ -69,8 +68,9 @@ export const { addRoutine } = RoutineSlice.actions // on logout remove all routine startListening({ - predicate: (action) => setToken.match(action) && action.payload.token === null, + predicate: (action) => setToken.match(action) && action.payload === null, effect: async (_, listenerApi) => { + RoutineManager.unsubscribeAll() listenerApi.dispatch(RoutineSlice.actions.removeAll()); }, }) @@ -107,15 +107,8 @@ startListening({ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const {thunkKey} = action.payload as ThunkEntity; - - const thunkFn = RoutineDictionary.get(thunkKey); - if (!thunkFn) { - // TODO - throw new Error('Thunk not found'); - } - - const subscription = await listenerApi.dispatch(thunkFn(action.payload.payload)); + const {thunk} = action.payload as ThunkEntity; + const subscription = await listenerApi.dispatch(thunk(action.payload.payload)); const thunkId = await RoutineManager.add(subscription.payload); listenerApi.dispatch(RoutineSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); }, diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index 891637fb8..5cb782db4 100644 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -1,6 +1,3 @@ -import { fetchSelectedMneThunk } from '@component/devices/reducer/mne.subscription'; -import { fetchDevicesThunk } from '@component/devices/routines/device.routine'; -import { AsyncThunk } from '@reduxjs/toolkit'; import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; type Routine = QueryActionCreatorResult<any>; @@ -14,16 +11,6 @@ const initialState = { routines: [] as Entity[] } -export enum THUNK_KEY { - MNE = 'device/fetch', - DEVICE = 'mne/fetch', -} - -export const RoutineDictionary = new Map<THUNK_KEY,AsyncThunk<any, any, {}>>([ - [THUNK_KEY.DEVICE, fetchDevicesThunk], - [THUNK_KEY.MNE, fetchSelectedMneThunk] -]) - /** * Routine manager is a singleton that holds all running routines. diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index 8c24b8763..e9a18016b 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -1,4 +1,5 @@ -import { FETCH_DEVICE_ACTION, FETCH_MNE_ACTION } from '@component/devices/routines/action.routine' +import { FETCH_DEVICE_ACTION } from '@component/devices/routines/device.routine' +import { FETCH_MNE_ACTION } from '@component/devices/routines/mne.routine' import { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' @@ -15,6 +16,7 @@ export const store = configureStore({ getDefaultMiddleware({ serializableCheck: { ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, FETCH_DEVICE_ACTION + '/fulfilled', FETCH_MNE_ACTION + '/fulfilled', 'routine/addRoutine'], + ignoredPaths: ['routine.thunks'] }, }).prepend(listenerMiddleware.middleware).concat(emptySplitApi.middleware, rtkQueryErrorLogger), }) diff --git a/react-ui/yang_model b/react-ui/yang_model new file mode 160000 index 000000000..3a3018590 --- /dev/null +++ b/react-ui/yang_model @@ -0,0 +1 @@ +Subproject commit 3a3018590be5f7c11a3ed8c3530b128c53633d7b diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index a43298625..df07efe2b 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -2929,22 +2929,41 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== +acorn-jsx-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz#a5ed648264e68282d7c2aead80216bfdf232573a" + integrity sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-loose@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.4.0.tgz#26d3e219756d1e180d006f5bcc8d261a28530f55" + integrity sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ== + dependencies: + acorn "^8.11.0" + acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.3.4: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.12.0, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.11.0, acorn@^8.12.0, acorn@^8.12.1, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -3003,7 +3022,7 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.6.0, ajv@^8.6.3, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.17.1, ajv@^8.6.0, ajv@^8.6.3, ajv@^8.9.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -3777,6 +3796,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3812,6 +3836,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +"comparse@>= 0.9.x", comparse@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/comparse/-/comparse-0.9.3.tgz#2ce73a4895e0ee1b333db11689c2f55c0ff9a962" + integrity sha512-wg/zg7YsMomMF9LP+LNSaw4IO7b/M4VLCmidZ9+wbYkZNXTkVNMFMgMZAu/7967BGsTn+14KZUT/pyyTBuZrTQ== + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -4273,6 +4302,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4283,6 +4317,34 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dependency-cruiser@^16.4.2: + version "16.4.2" + resolved "https://registry.yarnpkg.com/dependency-cruiser/-/dependency-cruiser-16.4.2.tgz#586487e1ac355912a0ad2310b830b63054733e01" + integrity sha512-mQZM95WwIvKzYYdj+1RgIBuJ6qbr1cfyzTt62dDJVrWAShfhV9IEkG/Xv4S2iD5sT+Gt3oFWyZjwNufAhcbtWA== + dependencies: + acorn "^8.12.1" + acorn-jsx "^5.3.2" + acorn-jsx-walk "^2.0.0" + acorn-loose "^8.4.0" + acorn-walk "^8.3.4" + ajv "^8.17.1" + commander "^12.1.0" + enhanced-resolve "^5.17.1" + ignore "^6.0.2" + interpret "^3.1.1" + is-installed-globally "^1.0.0" + json5 "^2.2.3" + memoize "^10.0.0" + picocolors "^1.1.0" + picomatch "^4.0.2" + prompts "^2.4.2" + rechoir "^0.8.0" + safe-regex "^2.1.1" + semver "^7.6.3" + teamcity-service-messages "^0.1.14" + tsconfig-paths-webpack-plugin "^4.1.0" + watskeburt "^4.1.0" + dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -4507,7 +4569,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^5.17.0: +enhanced-resolve@^5.17.0, enhanced-resolve@^5.17.1, enhanced-resolve@^5.7.0: version "5.17.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -5577,6 +5639,13 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -5909,6 +5978,11 @@ ignore@^5.2.0, ignore@^5.3.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-6.0.2.tgz#77cccb72a55796af1b6d2f9eb14fa326d24f4283" + integrity sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A== + immer@^10.0.3: version "10.1.1" resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" @@ -5945,6 +6019,13 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg== + dependencies: + repeating "^2.0.0" + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -5968,6 +6049,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -5982,6 +6068,11 @@ internal-slot@^1.0.4, internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6092,6 +6183,11 @@ is-finalizationregistry@^1.0.2: dependencies: call-bind "^1.0.2" +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -6116,6 +6212,14 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-installed-globally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" + integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== + dependencies: + global-directory "^4.0.1" + is-path-inside "^4.0.0" + is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -6153,6 +6257,11 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-path-inside@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== + is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -6925,7 +7034,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -7087,6 +7196,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -7193,6 +7307,13 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" +memoize@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/memoize/-/memoize-10.0.0.tgz#43fa66b2022363c7c50cf5dfab732a808a3d7147" + integrity sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA== + dependencies: + mimic-function "^5.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -7248,6 +7369,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7809,11 +7935,21 @@ picocolors@^1.0.0, picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8809,6 +8945,13 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + recursive-readdir@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" @@ -8896,6 +9039,11 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== +regexp-tree@~0.1.1: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -8941,6 +9089,13 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== + dependencies: + is-finite "^1.0.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -9107,6 +9262,13 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -9208,7 +9370,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -9500,6 +9662,13 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +stacktrace-parser@^0.1.4: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + static-eval@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" @@ -9875,6 +10044,11 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +teamcity-service-messages@^0.1.14: + version "0.1.14" + resolved "https://registry.yarnpkg.com/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz#193d420a5e4aef8e5e50b8c39e7865e08fbb5d8a" + integrity sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w== + temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" @@ -10023,6 +10197,15 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +tsconfig-paths-webpack-plugin@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" + integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -10033,6 +10216,15 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -10084,6 +10276,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -10362,6 +10559,11 @@ watchpack@^2.4.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +watskeburt@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/watskeburt/-/watskeburt-4.1.0.tgz#3c0227669be646a97424b631164b1afe3d4d5344" + integrity sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw== + wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" @@ -10857,6 +11059,13 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xparse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/xparse/-/xparse-1.0.0.tgz#4775a4bae747c8263ce51af9cef95ee169ac2efd" + integrity sha512-scUtMflBUTA6O72Ic07m58ZzwykVQNWeQRrUgpABDFDOF77/72KxD+JYSPhjy3sItuyHL80NruP0+ucm/lIXQQ== + dependencies: + comparse "^0.9.3" + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -10877,6 +11086,26 @@ yaml@^2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== +yang-js@^0.24.70: + version "0.24.70" + resolved "https://registry.yarnpkg.com/yang-js/-/yang-js-0.24.70.tgz#0b1fbc7b8dee2ff88985b60028439a4335b09161" + integrity sha512-hdb+IZHcQbuhLWmghq10jupVuoUDm+R1K0PATd398P+gby/rYSsma6saagtp9skyvLhYX2M+CvNWxQQBV7Gk7A== + dependencies: + debug "^4.1.1" + delegates "^1.0.0" + indent-string "^2.1.0" + lodash.clonedeep "^4.5.0" + stacktrace-parser "^0.1.4" + xparse "^1.0.0" + yang-parser "^0.2.1" + +yang-parser@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/yang-parser/-/yang-parser-0.2.1.tgz#b937ca78d887b81559c71c608fe9d850ebb7a77a" + integrity sha512-mmZKLVc4NiMdRBK/gnxiT35EP97k9tRDcjwUOenMLabgIm083HVFRfHmch60Wiq+zVWYantdgBcRGLk4Wy1QcA== + dependencies: + comparse ">= 0.9.x" + yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" -- GitLab From 9af1e4937226889ff21de616e0c60677b92f1976 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 14 Oct 2024 15:25:24 +0200 Subject: [PATCH 31/78] [ui](feat) implement yang model parser with wasm --- models/YangModels | 2 +- models/arista | 2 +- models/openconfig | 2 +- react-ui/.eslintrc.cjs | 18 - react-ui/.prettierrc | 9 +- react-ui/dist/assets/logo-Bj6KFr1z.svg | 17 + react-ui/dist/favicon.ico | Bin 0 -> 3870 bytes react-ui/dist/fonts/Inter.ttf | Bin 0 -> 804612 bytes react-ui/dist/index.html | 22 + react-ui/dist/logo.png | Bin 0 -> 66912 bytes react-ui/dist/logo.svg | 17 + react-ui/dist/manifest.json | 20 + react-ui/dist/robots.txt | 3 + react-ui/docker/wasm/Dockerfile | 13 + react-ui/docker/wasm/entrypoint.sh | 9 + react-ui/docs/README.md | 2 - react-ui/eslint.config.js | 28 + react-ui/package.json | 34 +- react-ui/scripts/build-api.sh | 10 - react-ui/scripts/build-wasm.sh | 38 + react-ui/scripts/clean.sh | 5 + .../devices/routines/device.routine.ts | 45 +- .../devices/view/device.view.tabs.tsx | 12 +- .../view_model/device.tabs.viewmodel.ts | 30 + .../login/viewmodel/login.viewmodel.ts | 2 +- react-ui/src/index.tsx | 11 +- .../src/shared/reducer/routine.reducer.ts | 81 +- react-ui/src/shared/utils/routine.manager.ts | 2 +- .../shared/utils/yang_parser/go/.gitignore | 1 + .../go/assets/wasm_exec.d.ts.generated | 18 + .../src/shared/utils/yang_parser/go/go.env | 1 + .../src/shared/utils/yang_parser/go/go.mod | 18 + .../src/shared/utils/yang_parser/go/go.sum | 171 +++ .../utils/yang_parser/go/yang_parser.go | 39 + .../shared/utils/yang_parser/yang_parser.ts | 38 + react-ui/src/stores/persist.store.ts | 26 +- react-ui/tsconfig.json | 10 +- react-ui/vite.config.mjs | 18 +- react-ui/yang_model | 1 - react-ui/yarn.lock | 973 +++++++++++------- 40 files changed, 1220 insertions(+), 528 deletions(-) delete mode 100644 react-ui/.eslintrc.cjs create mode 100644 react-ui/dist/assets/logo-Bj6KFr1z.svg create mode 100644 react-ui/dist/favicon.ico create mode 100644 react-ui/dist/fonts/Inter.ttf create mode 100644 react-ui/dist/index.html create mode 100644 react-ui/dist/logo.png create mode 100644 react-ui/dist/logo.svg create mode 100644 react-ui/dist/manifest.json create mode 100644 react-ui/dist/robots.txt create mode 100644 react-ui/docker/wasm/Dockerfile create mode 100755 react-ui/docker/wasm/entrypoint.sh create mode 100644 react-ui/eslint.config.js delete mode 100755 react-ui/scripts/build-api.sh create mode 100755 react-ui/scripts/build-wasm.sh create mode 100755 react-ui/scripts/clean.sh create mode 100644 react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts create mode 100644 react-ui/src/shared/utils/yang_parser/go/.gitignore create mode 100644 react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated create mode 100644 react-ui/src/shared/utils/yang_parser/go/go.env create mode 100644 react-ui/src/shared/utils/yang_parser/go/go.mod create mode 100644 react-ui/src/shared/utils/yang_parser/go/go.sum create mode 100644 react-ui/src/shared/utils/yang_parser/go/yang_parser.go create mode 100644 react-ui/src/shared/utils/yang_parser/yang_parser.ts delete mode 160000 react-ui/yang_model diff --git a/models/YangModels b/models/YangModels index 6af71d68a..9442dda17 160000 --- a/models/YangModels +++ b/models/YangModels @@ -1 +1 @@ -Subproject commit 6af71d68aa1deeef0f447567830327370653b37b +Subproject commit 9442dda17a9a5f1f0db548512446e3d9ca37a955 diff --git a/models/arista b/models/arista index 61fc7bba1..ae4d23359 160000 --- a/models/arista +++ b/models/arista @@ -1 +1 @@ -Subproject commit 61fc7bba14ec2efd152b98fc59e8837ad1db3ab9 +Subproject commit ae4d23359a4d25e1f2feb6878b825e629b9f2fb9 diff --git a/models/openconfig b/models/openconfig index daf73c37e..ea279957a 160000 --- a/models/openconfig +++ b/models/openconfig @@ -1 +1 @@ -Subproject commit daf73c37e9062b458bb9eab645840e5d3835c74d +Subproject commit ea279957a8dab6eb0c0b05e5a134bc3dfb0c8d28 diff --git a/react-ui/.eslintrc.cjs b/react-ui/.eslintrc.cjs deleted file mode 100644 index c4290113a..000000000 --- a/react-ui/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs', './src/i18n/config.js', 'src/api/*'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/react-ui/.prettierrc b/react-ui/.prettierrc index ced76ac70..5438d4a98 100644 --- a/react-ui/.prettierrc +++ b/react-ui/.prettierrc @@ -1,6 +1,7 @@ { - "semi": false, - "singleQuote": true, - "trailingComma": "es5", - "tabWidth": 4 + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "tabWidth": 4, + "printWidth": 100 } diff --git a/react-ui/dist/assets/logo-Bj6KFr1z.svg b/react-ui/dist/assets/logo-Bj6KFr1z.svg new file mode 100644 index 000000000..b7f71bd90 --- /dev/null +++ b/react-ui/dist/assets/logo-Bj6KFr1z.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with Vectornator (http://vectornator.io/) --> +<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 113.4 212.625" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:vectornator="http://vectornator.io" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> +<radialGradient cx="170.235" cy="146.046" gradientTransform="matrix(1.00001 -8.65109e-05 8.65119e-05 1 -115.465 -116.986)" gradientUnits="userSpaceOnUse" id="RadialGradient" r="217.591"> +<stop offset="0" stop-color="#c456f7"/> +<stop offset="1" stop-color="#34054a"/> +</radialGradient> +<filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="209.692" id="Filter" width="111.957" x="0.722269" y="2.46642"> +<feDropShadow dx="-4.37114e-08" dy="1" flood-color="#050505" flood-opacity="1" in="SourceGraphic" result="Shadow" stdDeviation="1"/> +</filter> +</defs> +<g id="Layer-1" vectornator:layerName="Layer 1"> +<path d="M35.1413 3.47016L35.1416 6.93891L27.1415 6.93961L27.1464 63.3771C21.6096 65.0011 16.4869 67.0445 12.2717 69.6596C-9.35807 83.0789 12.5182 123.232 12.5264 123.222C12.5341 123.213 12.5498 123.2 12.5576 123.191C13.1518 124.609 14.5144 125.761 16.5579 126.534C18.7737 127.372 21.8204 127.855 26.8082 128.408C25.0644 132.318 24.4639 137.732 25.3409 144.846C26.0816 150.854 28.2327 155.309 32.5924 161.533C32.9615 162.06 34.1761 163.796 34.3427 164.033C35.013 164.984 35.5416 165.705 35.9991 166.408C38.1084 169.647 39.1319 172.149 39.3124 174.814C39.3701 175.665 39.3355 180.513 39.251 187.751C39.2362 189.024 39.0999 200.614 39.0959 200.907C37.7122 201.653 36.7523 203.069 36.7525 204.751C36.7527 207.19 38.7205 209.157 41.1591 209.157C43.5978 209.157 45.5653 207.189 45.5651 204.751C45.5649 203.019 44.5477 201.568 43.096 200.844C43.1023 200.341 43.2363 189.045 43.2511 187.782C43.3388 180.268 43.3816 175.583 43.3124 174.563C43.0775 171.096 41.7912 168.012 39.3427 164.251C38.854 163.5 38.3197 162.708 37.6237 161.72C37.4507 161.474 36.2342 159.766 35.8735 159.251C31.8564 153.517 29.9529 149.563 29.3096 144.346C28.2621 135.848 29.4895 130.5 32.027 127.533C32.6413 126.815 33.2789 126.306 33.9019 125.97C34.2334 125.792 34.4442 125.7 34.4956 125.689C35.5735 125.448 36.2365 124.392 35.9954 123.314C35.7543 122.236 34.6982 121.542 33.6202 121.783C33.2264 121.871 32.6655 122.078 31.9953 122.439C31.0669 122.939 30.1635 123.734 29.3079 124.658C23.0392 124.019 20.0922 123.577 17.9951 122.784C16.1482 122.086 15.9773 121.63 16.7137 120.347C25.511 115.923 43.9287 113.157 55.0885 113.156C63.8081 113.155 79.7952 116.873 90.4333 119.622C93.9977 120.542 94.7294 120.755 96.621 121.277C94.2649 123.034 89.4439 124.738 83.3087 125.247C83.0835 125.266 82.9434 125.443 82.7462 125.529C82.6074 125.348 82.5171 125.106 82.3711 124.935C81.4271 123.831 80.3863 122.999 79.3396 122.435C78.6693 122.074 78.1085 121.867 77.7145 121.779C76.6365 121.538 75.5805 122.233 75.3396 123.31C75.0987 124.388 75.7619 125.444 76.8399 125.685C76.8913 125.697 77.1021 125.788 77.4337 125.967C78.0567 126.302 78.6942 126.81 79.3088 127.529C81.8468 130.496 83.0751 135.844 82.029 144.341C81.3867 149.559 79.4839 153.513 75.4678 159.248C75.1071 159.763 73.8909 161.471 73.7179 161.717C73.0221 162.705 72.488 163.498 71.9994 164.248C69.5516 168.009 68.2658 171.094 68.0315 174.561C67.9625 175.581 68.0061 180.266 68.0951 187.78C68.1102 189.055 68.2793 200.673 68.2838 200.967C66.9421 201.725 66.0027 203.098 66.0028 204.749C66.0031 207.187 67.9709 209.155 70.4095 209.155C72.8481 209.154 74.8156 207.187 74.8154 204.748C74.8153 202.975 73.7598 201.482 72.2526 200.779C72.2461 200.277 72.1101 189.009 72.0952 187.748C72.0095 180.511 71.974 175.662 72.0316 174.811C72.2116 172.146 73.2659 169.644 75.3746 166.404C75.8321 165.701 76.3292 164.981 76.9994 164.029C77.1659 163.793 78.3803 162.056 78.7492 161.529C83.1079 155.305 85.2582 150.849 85.9979 144.841C86.8306 138.077 86.2654 132.917 84.7153 129.06C93.073 128.178 99.944 125.471 101.777 121.527C105.258 116.592 120.674 81.4184 100.46 69.1833C96.4145 66.7344 91.6503 64.7196 86.3971 63.1845L86.3922 6.93448L78.3609 6.93517L78.3606 3.46642L35.1413 3.47016ZM31.1419 10.9393L39.1107 10.9386L39.3309 27.9386C39.3406 28.6841 39.9605 29.2606 40.7061 29.2509C41.4516 29.2413 42.0593 28.6214 42.0497 27.8758L41.7983 10.9383L44.517 10.9381L44.7998 27.9381C44.8108 28.6836 45.3981 29.2615 46.1436 29.2505C46.8892 29.2394 47.4983 28.6209 47.4873 27.8753L47.2358 10.9379L49.9546 10.9376L50.2061 27.9376C50.2169 28.6831 50.8357 29.2608 51.5812 29.25C52.3267 29.2392 52.9044 28.6203 52.8936 27.8749L52.6421 10.9374L55.3609 10.9372L55.6124 27.9371C55.623 28.6827 56.242 29.2601 56.9875 29.2495C57.733 29.2389 58.3418 28.6199 58.3312 27.8744L58.0797 10.9369L60.8297 10.9367L61.05 27.9367C61.0546 28.3094 61.2147 28.6381 61.4563 28.8741C61.6979 29.1102 62.0211 29.2537 62.3938 29.2491C63.1394 29.2398 63.7468 28.6194 63.7375 27.8739L63.5173 10.9365L66.2986 10.9362L66.4875 27.905C66.4957 28.6505 67.1171 29.2568 67.8627 29.2486C68.6082 29.2404 69.1834 28.6503 69.1751 27.9047L68.9861 10.936L71.7674 10.9357L71.9564 27.9357C71.9605 28.3085 72.1132 28.6372 72.3627 28.8732C72.6122 29.1091 72.9587 29.2523 73.3315 29.2481C74.077 29.2398 74.6833 28.6498 74.6751 27.9042L74.4862 10.9355L82.3925 10.9348L82.3969 62.2473C78.1953 61.2363 73.8195 60.4151 69.2716 59.936L69.0841 59.936L69.0846 65.9672L62.3352 73.3116L62.211 82.5928L62.212 94.7803L56.5244 94.7808L50.3056 94.7814L50.2733 82.9376L50.1163 73.3126L43.1468 65.8132L43.1463 60.0945L31.1463 62.3455L31.1419 10.9393ZM46.0197 41.188L45.9904 64.3755L52.9599 71.8749L53.1492 91.9374L59.368 91.9368L59.5225 71.8743L66.2407 64.5612L66.2387 41.3425L46.0197 41.188ZM45.5578 121.282C45.0484 121.232 44.5158 121.369 44.0891 121.719C43.2356 122.421 43.1382 123.71 43.8394 124.563C43.8712 124.602 43.9181 124.67 44.0269 124.813C44.2163 125.062 44.4521 125.354 44.6832 125.688C45.3494 126.65 45.998 127.755 46.621 128.938C48.9603 133.379 50.0248 137.836 49.1222 141.875C48.4351 144.95 46.6061 147.711 43.4353 150.126C43.1568 150.338 42.1644 150.942 40.7792 151.751C40.6905 151.803 37.4839 153.662 37.4356 153.689C36.4728 154.23 36.1131 155.445 36.6545 156.408C37.1959 157.37 38.4106 157.699 39.3734 157.157C39.4251 157.128 42.7199 155.272 42.8108 155.22C44.3781 154.304 45.4057 153.669 45.8731 153.313C49.7829 150.336 52.1324 146.76 53.0285 142.75C54.1746 137.622 52.9238 132.266 50.1834 127.063C49.4811 125.729 48.7181 124.526 47.9643 123.438C47.5056 122.775 47.1244 122.271 46.9017 122C46.5511 121.574 46.0673 121.332 45.5578 121.282ZM65.7769 121.28C65.2675 121.33 64.7837 121.572 64.4331 121.999C64.2105 122.27 63.8293 122.774 63.3708 123.436C62.6172 124.525 61.8858 125.728 61.1835 127.062C58.444 132.265 57.163 137.621 58.3099 142.749C59.2067 146.759 61.5569 150.335 65.4671 153.311C65.9346 153.667 66.9935 154.302 68.5611 155.217C68.6519 155.27 71.9158 157.125 71.9675 157.154C72.9304 157.696 74.145 157.367 74.6862 156.404C75.2275 155.441 74.8676 154.227 73.9048 153.686C73.8565 153.658 70.6495 151.8 70.5608 151.748C69.1754 150.939 68.1829 150.336 67.9044 150.124C64.7332 147.71 62.9036 144.948 62.2161 141.874C61.3128 137.835 62.3766 133.378 64.715 128.936C65.3378 127.753 65.9862 126.649 66.6522 125.686C66.8833 125.352 67.1191 125.06 67.3084 124.811C67.4172 124.668 67.4953 124.6 67.5272 124.561C68.2282 123.708 68.0992 122.418 67.2457 121.717C66.8189 121.367 66.2862 121.23 65.7769 121.28ZM28.3735 160.064C27.8641 160.114 27.3492 160.357 26.9985 160.783C24.0604 164.358 22.5881 168.723 22.5621 174.253C22.5614 174.404 22.6311 200.839 22.627 200.877C21.1966 201.608 20.1896 203.036 20.1898 204.753C20.19 207.191 22.1578 209.159 24.5964 209.159C27.0351 209.158 29.0026 207.191 29.0024 204.752C29.0022 203.061 28.0235 201.65 26.627 200.908C26.6562 200.425 26.6538 197.055 26.6259 187.658C26.6229 186.662 26.5615 174.385 26.5622 174.252C26.584 169.618 27.7563 166.157 30.0925 163.314C30.7939 162.461 30.6644 161.203 29.811 160.502C29.3844 160.151 28.8829 160.015 28.3735 160.064ZM82.9679 160.06C82.4585 160.01 81.9571 160.147 81.5304 160.497C80.6772 161.199 80.5479 162.457 81.2494 163.31C83.5862 166.152 84.7591 169.613 84.7817 174.247C84.7823 174.378 84.7241 199.67 84.7527 200.841C83.3011 201.564 82.2529 203.015 82.253 204.747C82.2533 207.186 84.2524 209.153 86.691 209.153C89.1295 209.153 91.0971 207.185 91.0969 204.747C91.0967 203.049 90.1265 201.611 88.7215 200.872C88.7173 200.833 88.7318 194.753 88.7516 187.684C88.7544 186.688 88.7824 174.398 88.7817 174.247C88.7548 168.717 87.2817 164.353 84.343 160.778C83.9922 160.352 83.4774 160.109 82.9679 160.06Z" fill="url(#RadialGradient)" fill-rule="nonzero" filter="url(#Filter)" stroke="none" vectornator:shadowAngle="1.5708" vectornator:shadowColor="#050505" vectornator:shadowOffset="1" vectornator:shadowOpacity="1" vectornator:shadowRadius="2"/> +</g> +</svg> diff --git a/react-ui/dist/favicon.ico b/react-ui/dist/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 zcmZQzU}Run5D);-3Ji}K85rCc7#JiZAbcKX1_n(g1_lKM2;Y*Kfx(oOfx*E6!r#Eg zz>vqmz|a}s=g!L|#l^tD!0YMZ62!p3AOOM~%nS?+8oK<!3=9lU0(?STl`w!&K!j~k zgQmH)mX)2ygeAI8?yeoPEK>4KBa+ObQ@v-d^PaWd&^OdFz1TQ7#&hy=tMn3e17nBk z?y#L#LbjZDtnCfkea)e=(<~;<W70BRXHU;5D_lEfYg;>*$7h<yXSsFF^_sTYd-ev8 z35#`|JQ8pH)^TuiZl2;Zce9$FLHORAev5Z`PF|s+sqNG_(QE3ep!Fy0%i8RU8|_M4 zf;XPBEvye%c`#tbfq>=vb?jYCLgQ4mb$u6X^PaIzRa?i%KSJBa(Pz#kWi>UIwi&8A zdY)5PmVF8N#=yY9S`y?J?D_1u*OSx(smmA`7*=|^IEGX(`u1&&a&_cs`G0dW=eu{R zK?~pCe;5*yaooLix6Z+JM{SumiCwCHm-{yDZEjxLB*$qgkJ{}NnU|&S`r?tkcY^Ev z{yST1nK;?*?*7}pYfrX7itw-H>%H;?r_VfR{LDwmYv+R5XRiJUY*%^o{Ky{pw6v`{ zFB?oVEtw?G%wO-ZLPkH=iK(r<{Op}_YZu-d+G<VVt3_AsT;cL1U&P_mmLSiS7n~O6 z=Su0Z-`>oAfPsO5!PC{xWt~$(6P75J0HqXg6klI?_7npHV=DG2hQzs1P?X=IonF&c z8wW*uO<$vFY8iR(o`H9;Nq9ow>LWgLHmPds8h8b1nps(;mpC^~R#H~BFKY|ke$l?X z%_gr}O;<ni(0$v&daKM*r}_zwwY`qjJx+}i^*sXumhZPMZ1A4BF8<1ApShb=G&HSq zs)E*^OuY5mbMlI)V~>qP;|zU6jYDFijz037ygXw69k=dzx=!u^D-M`Nr|LMknntDg zFW;~0<Pov|wzjQf_`X{@4sPLlZUnA6Y+u$IzUR8OjiW<lhmx{N%$Zjv;fXP4UI%YF zqoSdu=js!8@nhJot7fqo$||bveG8S<)UC71!**WLb@ud`y)o*@!?+9YL1}5jDSZz= z-v!&_uYQd={nB^AHj9*em)7YnZ8Pjjnze16qE9^2v2(U7X|l<$b*St#@Cnv)^$yu` zPDNcqRY%XUt}lG=P3Oi*s@gg+r(QTKK9OZ$U|<KOF}8_s-%aS~oa4Ul8Uq8PKO~jq zbRKrv7AVp>zjVv}_!FCLPKzzOTPBm*`-*K-@8?7@Gcm_=`+CG#ewQt(W_LKp&fu!f za4&_y^Qz)=nR#!e6c|1@Prnk<&HXQ(L59KbkgLXdR*{dvfyGjfGI@{mw?_TnE*8eN zlbeC*g67L~#m-e3=Y9$>m9W0trJGqhW2@j+o2&Ms+xl~yq7sj6F{yUB{HSMle5%FL z%Hxe|56BzO)11H5enXnIh2CSCB_(HUpIY;AT0J&3N~`yddQ+bx^mE0HS!XTv<|#K{ zVsboKc;?q_F*f;ii^KjmCfG7FtE@R>AHQwiI@T+NzRxG<z4ub#=dzD0{QmLn?f&<A zwK`32il5!(;fW6^DY>$bLDW#0y;EP~&2-&pHlfBB35_oj&am8ifAm9?e2VF$zL~S_ z&!r|s?Z4NNsdxL?OdbKrH-+a~v<){f)*k9H{mH=a{&~s@_o?T95XcJ(3=9kk;Jo0n zr0W<11EV7-FEB7LKoUPz(kLh@Y}d8;D_=slU$iZ1P|?s-H!_Vq_tv?2s)0|iO@3{} zfjbfVZyR_8+7{Hgv`n+fs}9?B)wO-5MM{4BmCvpnv)sDpc}!etnNkpc^{dB(C7zR4 zxb@68i%w0r_C4YH51+Z4_1%5rFMkT%aarBKC}8D5P-a<mC}RH|HGM<toJ!-M=!6?T z-1`=WY(5)v=2haY--iC-O3KQCtB)k!{1vqBxNTuW!nJRDu0Gnfjv-qw=sJ6P&se9d zrtaJ{Iqt%H&nYX^^bAZw<KixUaH#BvI{rjOLo52^^SFy2b?jY&)}K^TRx$JoGxQB{ zX`OCY+G3qu;oiF-X#EL&4?i_seTT|UP%&H5<WSWWd-hGhiUTU@8ZK?qW6!^{$*VE& z3JTqRiSK&M9tH*mPEa~$P+j{`{rzW+PjwgXzF=TroCitiy_1<|IU9<&#oyiUn|phk z$+q0;|J*Z{<h4D2c$sq@i=)c42ka_I6BRsCf3VIB5qKPa<WNTa)L9u@tO81+cmr1( zIOrub+)FT-sT(GpusQ0DTDxOEqw>L*N!fRgJpTCWhMk_e`VZy=7H1U>w;Sg<Cu&G+ ztWYwG5O~OvEHowL)=Qt|4xUm!ty36Mba&S53(#RaF~xFW(AulgXVZ*D7VUT28<y+K z{WfCxt+!_-pNl(0&M-gsb=OtDHMT-x(|P)yo;bCtl(+WUn$_A9Q`-|W3l)}JGdF8o z`*!YK+YH{{QE%S9lgVM6E&aN^_TdV)QyZ5?yRG)LbljP3$+q;`Ywjl^J;sX;TMD0B z_<3Gqp;O(Bhe<mQKMjrF5!Zi*A)0;r7ryegztvUk>}BoJRqZ!5x)y`bzuD|<U1^^R zr<`=3cJh7p$0_HZcSY_K`@bsf$*1FW53ICIE(gZ=+s&W2pnZ=`{q@Pe!WX|h8&$)8 zuluO^<d0L|XN6pO@;Hxw%HG}li`FHmczn?QwBOzT<L?hzFDkmH{$N}hp;f~)MI!D$ zD}M?<fsEt8z`)=D&Ny?oH@;zDV6q~daj@nlJc6p)x(=0{;d`zpT>lYw@ni6&GtNzu zb?ltAENmhU-c7vqJMrdE-}zg$Z5$JC{)#woM_E-hWa|Z=d0T7?>+MQgyk~Dnxc1Gl zw%2F&MvIhu+oA?lZ5@Zoj<^f&gEyVlG_|xXYzSC+Fm(GRC1sU>Rfl3uy)f_!3|w_s zNm)5``$c6nwfHMv>`I#KiW?Jd{D{Bu*)%fQ&_CQXD#g$*OxxDU&^J`u+CkslH|ESM zEo*z@;22E{8>678_^V&FZ5?CJzteGW({XTB)73Zd4mMBB@n5#jGNr&GG1sZC-?d{_ zz={KYi*~9T7#WAe#-4j?U(s$H8t2?R)hs4GbjM{iJp-4PY3A{nL2HkBOkC<YWrgp8 zZ7LdC_GPV6#~w%QzoYBuuB@UOee$_Qa(?uQXOLP(-N@9wtj!`RPgP6XXU-<S#k-6G zA~emdZ42r&OfBLreF|8<-y}RSaP^UpE$0oqf&$kZ4cT(ebMgwa*o>g{Cqp)$HSh^` z>z-?wTIkv_+qH9!WqPq&*Iei3DavZ<F{fW9T>Gx3Z)g^i=F~XRvAQQ{-SOD7Z!}EI zRdw{Vtn9QbZ7tJ^tkO%&<1$0HU9c~2i#q-!V*l;9iys2l9`%^8SkufZZ08kq17nlW zIM?=>dagctZob|#*Ev*m1z(rpV_;yA1eX|Eeb;|nW1I4K2Iua*Q?>u}|NMMqg3gU! zUk=!Y^)oQA@IXqCC8xJCIx8};TzKC#t=+liKkMULtZ|h=u~&U>KlG2if92|31HThS zXHUP~uOuzGYSkhQgD}y@8V4d(16)FM>ojuLd{%tq&2ukuv1r|vsee2#rB!dfEr0J} zV*Q@w%fA>;zv^G0Hbv&blFo$;6@A~8=Vz_`a%)>|Z|=)a$(pgbOD46S)I7F4J?*(j zM)szU=PoUHmY%-s_{>>vBrj-3G#q_Znpw#jc74_M?A04K#YF$H(z(H5cH>UgkxjhT zyOnlZZ@3=u^B?2ww1W=?kDvYhcXIH#bLY=n*xt+EXZ`HO1r3Sj?r)cuI%Qu;{e4z6 zMw->UKs)!{yNCb$ZrL2@4gA32f9csz)-Rj4R5qpW7A+~c@LD>5>fgPK=f4U2z_|O; zlVYa7f7Z<WF-0x@L!!u^#`j^Obq}^*leAx}W$~atP{G<_=|P<xOPaXTmNrh7HRQfi zv83(#@{jXbwC4P{=(zsMhYg9!92+-_ZCj??l@~BEQ+v-g=My>|$6h=+8~?D^FX`gL zro%g)vocKe=yTG#b!nNxTptaFIGc}$8=HL0*bBV&1xz`~v9xdHB2}fyK{`(?Sx=-I zrv{x)G@PKpwdj7~af_RMTe@<+PjAdUwk`MepY4^IiZA%it%^Kf`g*~E^YI7X+h>07 z_^bVizw3yjV2#+%>WMS9*za$Qcg<te)MNBI?XtwCfotWOMNu&!#VdofI5fmL*RN#t z>YB^cS}G8sFU4!(C2Tosq3L!P*R3Ym$4%PRGM9##++td|?t&P{`nIy-G^+>cI&&Aj zaB|-LPGuX%uCqViHMT#T<{<c`%QN1d*+y1mq9RXR*NF$0_a6WD<g3#}RRNy|<r^i~ z+*}O14zAE}YmnRcL(XG{s=+bljgtG1-e}QSWY8gW^oWGG`q5{M)BW@eN?RP>Mz#mA zgun6plj!%zn`ajP%p>+6E^qCz?Mt0grk^~0W6x!SWHE#9MyFm|br_fh>6TtPvNk60 z%(f>_w(Qwz7NpF3%x%_Yvr8Yh7hP>!`=)fpv)<fC9}d;eYxn$^S;wd_?dYEchx>~I z{wZx_;Ql;+4{vH_<<rHd17<yVeCpGr<qPNBy`&Qy8@g;)SgZ7^Yg1OPi(2+7|MhF> z?G;szXFfU>oR_<%`qr-U#G5VW<yw#K-g5V=MsB+Px_?ji9@xL<H)~Jyat;Z}q|IB! z3%4CrySkoz=L8k8k5wnS#JgEM>=Ms-hZyQV`(fzc)M>C!uReqQY<uKC$IIUqbLqaa zyWPEO^`eNYi{91VU-6pf_C;&<!{7Y2)ZZvO`nUhwj{k-Xy|1qy@pn)w(?9Yre)_kV zFMP*i-s<ts+^cOch1pt0gi(<#?G%r|vMrZY4=H#>Zug&Zs83!0Xl#6!^?iW@>Pl*U ZtMWJ#1p_C<F-T5Hu2|;y@Dg%;1puB)gNgtE literal 0 HcmV?d00001 diff --git a/react-ui/dist/fonts/Inter.ttf b/react-ui/dist/fonts/Inter.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e72470871b8fc198da424b1e17ed729c202829cf GIT binary patch literal 804612 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%0Ax6j{ZP3#Ka=%E2kFnV}3!H!zffX;7aA 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�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%0A&7R<ezA4~-nJxGL z9q<1xj2kvM{|8-{;_^R)sj;Ea3w&r+=Ktvbpb3fi|5^WY|0n#9;cT2bal(X&y`3E$ zZs7Ihf#8D#0{;g!bKSYa!^89K$;k^BF0_b!|MKF=lP8ZJJ$Z8H#+@@~4jnl2hK23d zpGMa2U*DWLcBeTHJl+i|itaExXZXPI6S@m-3MdFcfy&6r@PXk8!zBjLs^F8Ld$qwj zKm{1+r0{bLpp6SF7?v>1VVDL==L}OArZX&MSi!IbG#lHzNl!q4iHU)eM}X}e=uo8( zZ#a3lCHeUN{1W=lC@8?f#LB_K!OqUc#=^qH$ic!R2)-ohe>?MU26pB~)_;FN7qvGs z{r~%?oso&9k>P&}*B{U*(f>c75wjMNzYKrD3ur)#X#RkYmHorS+|2s-|DPW}{xoj_ zmm9VWj0}Fzor*@#v$*(7GIHX5-Ru<=6x`xGDhiw!rZUW6n8i`+5g1-k@r8w@St3eI zOpu3%hgVQuRaWfDMP?a;goK0)h9@stUH(`64*(B($FVi^tXQ#P*EFC1E}(S?;Q9QN z|7rj8{+Irr02V1>oG_tTa>ti<uiw0R^YHp(4kd*EO@TKT_w3nogdxC#rzMKv10xF~ z2O~eY$`)bx$MA;X9>Yn7T?|_ojxd~M038wak>Ll!FNPlspBbhw909MwnbO=2+TJWB z!UEc4z|6+P%FEBe06Oi5Ur9}biQ(6uKh2;G&`m6FUw`?}+{nzv&&J)v@V`Ui3#6#| z{o@xS8;1Zp)1RL|zWw;lAi&cKy5x8Yqz?o-zYI3dQ_8^106LvgJtESC<1?$OiZU<D z_ggod>?BwoZrreb=L?oc5AL(^$f&BQ?AdpoNj|(;{lgz=BYQVvDSl24b^#t9^U#oB zQw7Pt&n{g0z{<(N@%I-C%jZ3N_S|ZA{9o`tpRujQ^?%;~Y|sMo|K<P7m}hL=yv6B% z4Cr`8-WhAwZ&*KZ&yM9Qmapq*aQa^bnqp->u&1NP@qgw2{N@I=7tbC%cyQ;&`7d9- z{CM-`*_}Ig?!Wl^;|KfCKZ0MreEIbcG|9lj!`z$>J|Fog!wH5{psP9=J}~@;2KjGr z_vRC{RrHPF1H*HM`wVv&u7NN0SPaeJbHJN4Kr?QjmedM{b<L~O|EqxyNR0a*_TTlt z<$p8q0Y@_b<^HRJPOSfL{@?sR=mb<-@Va-e|9=1V|AS6W)&6h&-|oN7f7Ac^pd~{8 zHUBIBSNpI2U%8osjrr%NZ;ZS`T%gV@&)@$HjBH#iA3yy5_3IDlLUe}z%?%=;H2>?z zj~{>jKzp`7e*XF2$jtoz4^uPqzdwJN+E;^9z5)Xy1L#~KB?Tr1Dd<T({2VnkHIZKK zo)%VyMi$~69L<f4B3vzOK_NjwL3$$13_CzK6@e}?%;%agXZ?a5yLazcvtvhdBO}Z2 zCXT-hXU?BFbLKHiGZ!ZVXz>%MpUCJ5%K3~kj3%JE8+2k5qXwf)C-a{_O#hoW{{7<- z6%pWLWoqtV1uu;M*V4rBw*_=U=8qr0py#WAZlF?8fb6grWMF0htx*G=#tB*m$IQfT z;bWkZkr9^Az_!MPVFyD91452r3FwZa4NE|W3Wofj@jsz~&47jB2g3yhUs&zW@CW2R zh83XpGVENb=83!?{{8#F!S?UVkAMGoc>Xm{1h)s;7=Qd|fwWn&85kLQ85kJS7?>Em z8JHQ2Kx-o-Qb0=}bMrGIA`)U^k^((!45JDPA`NYfL5b~)jsrs<w}gZQkC1?Zh?J>U z8FYzrvp#69`_FGskCsnH;K8GJKUS>hosyI6<Ktr{{O{Yf6@UILTMjzw>m4Y29%}f} z9R5G$fAaq-aHgmPor?HB<$w5pm;bi^LG$tU|Goal{%`o7{@($#gYm!l{{r@g$r}$I zIB;mX=YJdU5O&%B-2WxuttL7D^BCJEIR7sM-;ra`+^EYgAi@JWQ}o5P8-GNE7z_*; zUa)`;th@R}M8MGC&mT8O3kwU24?q9>`J?Q@(wq;@0~;AYhr2#uWP;=yMrLpi;tazM z_^E$;!ACMahUTOX;NgWcpo3mPVb1_Mg&dN1RxnIqm<Tp=0>dJPEev0p7cwwS&{vX> z65wO!<mKby6BXg%6_8|N{L7#quc)9X#=|Ed_Dw(lv;~KWiBEuEfS>&jUvnc1D+3b~ zV-w@wKb;KhO^kp4HZt%xG5nj*2s)FEfw4*S&#ylWETA#r|9=?%e);m{`yU1tE{;Za z(8X&U9Dn{dF|zTrEM)jM0i0t%<z6HM1A`}YCn9JqHn<re%*7=X5F2D`V`Cc>8{iDu zkmy_mS_T7|q2I&M!B&!}D<h+x+T6g+!otDu=MT&G8!Bu+n}j$R{(SngV#WDC47wp9 zAx1jaPOWGLoe7a4v|+=N2{RWjo-=3h!l^yeIy*W#r+fS__@DY8G!X3Y-|>Iq|D6Bn z%rn-kndI=lq`86n&mRK@4i0@Uiz9n(Hwl6IR2&u-IvgyIZ``<XaEFgG=$OVSpiBrl zatj>1a~MDiuWm5BVPpkG0iyuJJMhT=R_HN}sE4k;X1K#}gkcB6isofXpT2zi^X=Qm z&)+_L`ts@Hhc};oeEa?F-o0<%e*F5$#QNvUyEpfmn;3YSSeT_OZhUNJ=3!uAYGUSL zVc=+D{&quytEGYI&mWE^R(2kaAK!kpGl5QE<p7mjU%v2gazIbJfwjay>yNz{m>J9& zSQrFKRCJ6@%<O#vb4sFg{F5UJoEVlftYBEhTjx*`;i0Xg>t*BP6I1NO(9bY|VIpfu zlmZVA4|D|rV_IM{tB8n*0*_!5@0W8+Hq76#W5+WN2@4C0Mo~@y1rZUE4<9~A%9?_@ z`b;7s44=NVFf@SXMl0ExTbgIDSk&bR%5scT+C9OGJ$(OL|F`*X{U3C|b;JK0_O{7W zCeNGG(BS?*<G;^;^ZyqA&HsZI9#=4}Ub6<&BLFSx3;!R{%=+NLgKr;xHt`B*Sun8K z*w|?NcyQ#%ktUHB3=bZFF5!KA|HP3aM~?k_@POgj>y}K&6;KQ}8ICZl0Y}{ghM5d& z81^t60H4ec$~T}hH7|qL!ae|<NyezgD8ld`G?x!PMe+y34@MS70Y(`{4KS2q<X}um zaRxVzjTvp47cu;AVPNW1{PX80!=K;(nV4CAzIylm>xVZ#{`}`=WBc&o*ROwH{{8#$ z<7*=;<G){j{{3lW{`LLy$L1y`#$SKCn3&mETbO?S_}R+z`}ePAhJT%)BK*&v|4qD1 zY#a=rp&d>J&}#igQOL>!P(k+R8z{>$fNmH1)3S(xu?4gM6r9ui85kL285kJ68JHMA zJ$=y01w4K^p!MY?|Ni|m4JdN~FSG+Kx9evuNwPD@sCQs!<;aV2v9YnS@eFQm6n)L| z;)RS1&#QH7);wfnHVg>~vDEm&-Neel&BDOR(E>SzBLLJiW?isg&YU@u{r`iu*nzf_ zgK+SF(1o#}qfkNT(SlmtC2U=wGf@{!Yi<;M`9nkF$B#Gc1_lPkjK3dVxNzb60};L^ z)*oN~Fi40%54;9-g+c9LP<t4halq>nb~9XHxB^;30y@Kx;Ug$^7#ShikC72vW`b7k z%x9R;+{?)Lf2xEK*FTnj|2Q~U{(bw$_>YB&Q&2#Vn~Q;ksgdnJ0}~4ypGb2f16wQO z|9_3loWhL%J6Zq#V-VtGY-wcv#lXSQ$ol6$=w7!*c2J|>=N}dp@JtvZ3rkBc<9|lT zJx+QIkn^rVCp&`nOMuo<vbebT_;5gT4tI=~m#>YLiK&GY2M6>}N0gQU%Y+FH4bbjM z=KpN2jv4D_tl7MM!_ti#AZIu-viw7CAq2zfT2So^Zyk7miYIUz!2nEZFv>Jf2lvX+ zn+pw$OiZ1yCPM?`pFhn=%?9Y*O`x6QwG0dl$qY;kpte0|7l?L%hN_N{y-#RNXlOu1 zb$MP^q=$=-Pk@H1CZ?zZLmQ)zkOM<ov+lERf}rt25fKqy5suH#o;`a3TGRRNmk_wW zCm|ssA@BpVgadRx84F7*Tg!p{2lwop;`KlOf6o6B@JZmHoe3`gJ^p+C&*7RlrMJ1| z!2aF1l`v17($x%Vy(|H>VVc=wctESMSX#tI#6?6zK<9<Y^Lznq83L^yc>RKbxrq(5 zse|*+pVoXv0Y)B12JkS`2ZnFZ`t}pU8-@=Ie?U8(7<m}kAbmMTE`~P@FBtBFdvIqM zE<sN)IS;POZ$e9tCy-Kw;Tb4)K=IYQS@0hN=wy7*nK7&!Y@oAJ{x?beXJBIG<N}T9 zfes4>ZH#63&j3E`gsFKm6AJ@#2Wa&e3;3{U7SQS2te~;{|9?7|nE(7~-3-t9@z8yZ zpqvkiGY5typ%^Bun6!+Pl$4a*7*9|I>lFjKD+*S@HnJs{fetG*ZD#&-;DtgXXo&#m z2y^a6{+|qM*4&4!5BT?ZO*3c#Kmy}}DIWiG{zv`~1h3VL_#gh?_kRv+XLCzSa~nt| z2E3O96ld}ObN<&d&z>`9w!{A_(EaZZ8bP!6phLyqHL^g?GH1C4nzC<XR555~D2ZnP zUG<a!E~n=+K&IQFXCXr?SlCoMY6bfUT>0)}Skb(sLH@@dHa;G1b_S+jcOSj^!NkBR z_U#iZ1JnO+zgYh<F|aT<w}R%yL5_IU$N)Ln{7);xua-u}KYu`{NPxl@>*?l8z~St{ zz{uc<bOtqOt)9}39eR2P{(S)*F#YkLAlutluiml=Y6xFFb?Tmwk|pR+YWrp;8PIXi zEG+yi4BwiCKi$y~WM+woFxI+qZq1rC7Z_L#Bbt>=OkTXu5Re3oq=^a0X{gA^sAwsC z_$;iUA@ljelOsot9C_Z%bb*BhblKXEAAf!}iOAX5oY;5c$B7fWws@FnXlRK4`FZ_B zbJG8ae>?u|01rTcIvw8N#TG)K!KZ&8{{8(g_Fn_Me>fR@#W`pppv`}k|Dyjv2M=@n zmjkPI`XA8@I`&yf43vL)I0Z$7q=kj}1O$2bgammd6lDasxc)LQ3JHmb3pBSe^Zj99 zX<}uOwz%<;v5EP|EiIlVW^RVx>@7+c?%aWmSKYXA<IaNz7tUR}apA(5Gfy7gxpU_> zXcVg%bbd9YkL=9A$PmoHz+lM$xiJ%Tg1Y>doSYmj8A%?7FCV}DdHLl_&X+G=%w4=< z5^{>NQYv$Dnwd2;M7WwHm>2?r0s;bbKr1W$f$|c|md#tXY`M$Q%&-A=R8k&S&x}<w zHf-CxVabLK4*zr5H*DCjX-aoPgWLa{|Cx|8yg>m6>YM#*l7RNj9<Y4)@Bwro%a<=I ziYh89A|INAKsg#;2@Gn_GjwnlfR34p0Uh92QscnT(Y#omkB5(korjN)Lrg|SMuwjY zw6}<dgO#1<-}m1?zO!;QH!-j@G5l|3_}vUz-1NVdff?Mp;{|nhe*6M0y#p;$Y-9s( zS780q3>}>Yjmfw$Ffdp!FfnLDZ(jgSp@;m^108$2f)R93K^H?0Z%IjRNoq|^4F?B@ zqDKzstO%A*8*V8<&fVwZYh>j)zG1_L3(c<ob^cp`uX^<P@54A@0_dP~&~l#W|91a9 z{`>xS2Q30(?&<070IiUV`|sY|$n@j^PbcK`eRdNQ6UAnRl5l9Y-T<nsL4gJ?G%-)% z-vO@XS1{~t?q^`?mJnbQkP#3P0_|K7W)>0>6%!H?VP|3a%H7<^`0pS1H2!9We{BrB zpc}pa^s|84O3cmu4F8~Gp`cTj9T*tk=TCr6T?Q?~YGBio2`Ty~mjpVsy8txW$fjeJ zBO{ei<-jn5p{SWbuaTjpi9w@@!J~!2t&w3$i_`xQ(C{JSf+-IFOBfeS@co|yp2aZu zukk<Qf6M=v{|Wyq{>S{c_^<Q7pc!=ZlS>oBjwXf^Eg-f-ODJ@q2l#Yy#1Y0&QP8L$ z^jKqtJB$L&Ge!AWSU#|@uz<EZ2(f^G5DUvEmgboZUm6*Bni#$`G5lx&vs-3@%cR{5 zj0~3;7#R8)m>8NFm>E35E73qJpw}|YV5u)CD5!T~n8C1t;Q(lQkE0^N-NM4cJ)r`0 z(i*5GxP@UVb5)FmnG?ejhGh&>*sEedjX^sL(5VvZ7`A~nC9o$1Iyg8)<<xjHOkh~d zumyaNVH3j?FdJk>FGE7J=C9Y+u3dZmi$h9EiUZ2#mXea<enQfnIRXD({Cn~5|9_7E zBH(cx9q^59O#fbh*P})MPx+tA)X~vV@IUu|%KvE4_LKjheS;GJRsLIor|m)Kq$~Y5 z`EUClG{z3XvHuhPEBqJ#F9IGY0-Z1nx=f<tf9`*u{{i4D;Y9v>{CE0q_h09~DR{C0 zbjp8BvnKM*BO<aI8X5{B96x^i;6T56=j*RV;lFaAg_|7Ut9Qh?kgwjUhhA0UfPPg8 zE^%tF2Xa9y>}=lOVb8(x`^O&^4sJdHUXD-io<4f^@zbXtzrKI^^6fu2kKn&wKYoAz z!tnjqH}E|$pFV&NS@`nd<+FzmUcCG9_3O8vEZ@I;dHJE4k%PI3>GzL6O-#&)+f_g- zF$pgk(qv&~1|f#ue||H77|hI|Bbt6QaDXY$y{XKgqrzDJ{%_;~jZL#K|7T!jW?^A$ z<ODJQ|7T!gW@+Bv0jV`W_dZQxU|=X<U}8vSU}mslU}1n9vDU#>5bojO5nceA{Fot~ zk`iE{Bp@K5WD$@;T)RjdnvgLPHLR^9#K-U-w3rg5t>pV(<-am`RLTE;I(S8i|9_YN zR{xbjH`{PbTd?Brk;AJOO!NF-|G(mY%KxbUp!sgleu>Ec6|9rGdwRMjxq}N{a1r|- z)Gw}JZCku#$>O$Vag;;}x*7+XC}GVj_Ad<oLCq`mMi%f@F^!Ch2F)e7(i$#t3YuYy z8U9Z;`S<JNyHCIVF|x2R|9kP|_KiEwU%Ytt;q41PZZ0+krk~haXUt5^j2tY;Y3eul z#-2uKla2W`10$r#_7~J-69<)zptBkO{P_bqqY=af4Znd;1H;*lTg<>X8Io#1W06(R z)h?jb5gOoBvw&d%Ll0Y7oR5!Be1#)JFT(=vjEo2ebqNUxb%%%yN6?0QY&EGgq$ZVs zrWbI*hs;K*T`z0^-D(4Bl^Oka{qOfb>ObhZpQ8V9{{#NJ{Ws$7=vuO3+qpC6wyjvw z1!{GNFfLf&`QHUx4Q2fg{2%c@_J7#_kpCgfGiJ=1;`G1df5HE-W(nj13Ytd1g%!q) zI62@rw`a6tv`4)<2`mmOrO>WaBH;#|#SBc{4cdRceERx_ftihimEqO1ySMJWeD&(X zr}wXZ{QC9d$DcpHU;p~`_usEye?Gl=bN3teas;`87YAL$&dLH_zl{>nNO$loW`N$o z13Hxhc5(>p6gCHj3C#?9njQZ0G&7WdZW<J5Zee%<yJ--#s}t5zFo2$cFM6%OUqeDd zPD@Ml?S-t;np{_<zn71kZWgt(^N)%M3JQvd^0%`y68-t?*|VQwCe3UP2Tt+X%N=q0 zpZ?$de+A>-BcK6gqkljCz54IWc*MyOyw4@5S#-{v$#XUxIdWvfj0tn*tiHo%U|_&| zYgKb7c*~def2;qnW!SF&t^VtPMUBA2(x9P~jQ_F!z5W|D&lD9A5#r_M6%r8>12Z|8 z82&M^@imKr77d_bW@e^l(GMTqfBf>}$B)nN-+cJ+`8T++^!sx&<b*4REewnd(-|1R z_ta-V*J3&_oZ<<xcTOm%tSL#0^VFAf0x!m$$yAqD54shrnW3Ix62oS&D#y6|3QScl z4DAff40Rw?&4vG#{af_!_`mnyiQ|9&+5QXtmjXk%|6>2e{{8=V{og(?-0*J^7_MVD z#&C?`B_lth92lxG8Zladp*@&XX86tU2n?@)RUTtF2ffd{GxUEIj{D62{^x<;XAU}F z9_c>w^#57^6aJ%LfR3yIba|{svu;96kOm723oGcP02u)Z1<#zEoUDwDjPMU%UhJ7M zW5&$cbLPz1v}VJ$`=C8vO$@J^K|7~%z=neo1!x(QKPdP94}l(I<p*9ilk*>RL0ruL zSnwpB!+)Fq2LI*$i~JY<FZ^HfzdSf8sQj1wFYsUBzubS&<wG{$9fY7ObaeikH*YmO za_scQOP4NPxpw`=_1iaYT{(B^)TtB4jvhO%pro#=r?0PXXk=t$Vq&7Nsivl?te~K% z)NBYIP$Y?HW)=|OV{exQT}sI<A|fIrz%L;1hvDD%4<A2*#u7e!`SRt<&o+iXuv_o3 z=g0-k3?G^u{(Wg?kOAdLj^-AIFR&a5YP(xPZ%hH*z%0(d!ocRim2vJ_QIP|q5EC04 zn**Z|dr=WvOu;pqU(F1E9R8Oya{m!n_v?q8m`L28H-8!({+BTPX=d!2<nTX_<<O&D zyP81lJG=jOOijCXftYUp)0lQmThuJfq4MAX$15YYU#GskI>e^L@!)|9M|1Fhw*Pwn zLA__T|7`yi{#*Tb`fmiDcMSVq@Zaq}8(2>7KU?$k28I_+j7(n|K|2EZ82&Udyl9y& z%*6KR57QqmCWdeS{(NC#VfyojjR|_IkRJmhgF6EQ1L)oZ(9Tp*(9Nd*RhWPL__5pP zf7buF|CZnmy7_<4{{jC!!4Yrs--d~Yhr!{$QDdV6!xUC?&~X<`pbO&{f_I!OV(4X< z!e9X2#cKdM*_!pigZruhSzZhs3_T1B7?v_@W!S)QgyAxH?b;dUH*Xkf8XMWJy!rR< z-`7u|ox)!K!H{X{l?|YCQDYc3G&43d_%Tdi*bd$`3>nRW4IJ%ZSPI%9%~(_8z_6fs zx-b)i1oz*6|Cty-D_P{kCD;@c*qWOdm^vB$b~G~n_}9eq|IdTRPo6w^|Kr1xCm*08 z0Xln$6YUgEhyNuF4*&Kwwm2}nXmDVXKs{rVn}Lym8>$1g=80hg_-cxO(v7W-3@wZ< z4Gzp2p!1<X#|5>5?iz!h5+$d=$RMY{z#z@Q!~mKP1+8^rX9JD5F)=Z@{nPn>;y=&- z9sdIU{rUTqLB!#IMGHcfnTH{UaR);M(-p=U%oz+W4h#(~E({yME7LcC?_B|%BM!R2 z19SmKKkq9RmRGQHnBjk8KeGr2he$VMrA!qABSQ~#XR;pyGXtpI;rU<h-?x9C{(brP z3k?7L*ZH5t(Xn#Nwr$(C9bWJIKj7b!f9L+)1NV&{{e!^w|26(+{jXqIcIworH4gtX z8XW%ZYGltjaq-Hn7k^osINyELEUL+|WVv_8fuV!FD%oB3Uz*HP$QJ$t)@k?u{L)Ej z_F)WQ5@3ADxSeq=;~K`bj0KF^j0%jB3=bLRGK21|3uXAsIGOPU;||6hj87RKF>YdP z0K-N`XGTs&0fwgxTNoBHEMQp3aG%k*!GTGn(cymq>xXN%ICO-XS#KVAtYcH?z%Yra z)>8vCL07@L;l|lHH;h~u=7WdrE-<WQic&ZNI;c0SncXHK!i??3v1!l)qS+?zc=m@w zC&!gxA;VFIGYl&j7BO`4rJ73oxwmz}f(0ASJ^80#*1Sqh=*Q1L|Nb$tvoW#$`^_vO zA;r(|<DZ1MxCjr65aZkDuU>xq&&13p*4)VY{U2x+v5AR^g}ITLorCFr6Vrdto!@`| zHnB1?GVn5fZDxD%=hts04wh!=U*G?5@Q6r=@NhhN{_*F}4?j4hRa8`D_*lNZcmmzK z3%Zk_9~zgS`D{>Jdi_`V_vYV=f3KheZePG>x7D%DU$q9bdCKp9^?&t$_x>&Vx8~o0 zf9L<*fWoK$<v>TgvCKJe;J_k>|8Wft|K>F!Vp9klo7FM8e_mAOrlloEVMb*dI4W;3 zE@hkohB1svper#MzA)?nCsfb|il>aRj7J%-Fo`g!Gchpk21g|*LY){n7zG%fFl+>G ziJrr7o6!KA`yBokuz@2};9nCYHuD`pyQmpUbR7O?uyvjOCnIx13$%0L0J!j(!xW-$ z!tsCRe|)jIgy9my6NV!U+ZZPCrD$`Y#U|UEZ{I$A`u6MRw{P#>edple`TybN2aZ2K z896!FzTCfg@9xu2-@bAPH8-+;`SOq9&z~kHRxb8N&UX)=ePj6d_SUU8ZJ?-R`Thwh zDu05bQdUlc<H?&J3~U@f*u)hS6r`Y03F!}1GcYo=K*t_I`4Y58f$>M2!~ZPC7Yq*n z)7bjfIm9VB<T`<dQ5ZUT@*I?YpWD4>?=4Ox+e}A>MurCVdM_oOM<-64Xk=K?=<u(m zk%7<QUq^$}zZL)9{kzw|%EIzu*Sr>&|Dpdu2RK^%k7t=MZ`Vs!&^`p;|2dqK=dF43 z=FQm^^Licrdp9#iD7iAqF}z{OVN_$-!LWqeLC;0(=#(i_j)=IVxG-#o&TSs$FLQCS zx3RHtbaC?m-Ic@Oz_6jwfni4@Q;H0O1H%NyD_5ErwTnC$<}jRK6k>!l@0A(uFw9{p z(P8ifPY7;gSjDh}VJbA0^fSz2Si-QDVM}uZq*Pn-#ev~c1LK!3P7GH-ONDqQZaHy} zNkT$`@y>}Y6CM87@Ge=hX3vScA3l6|aqYymCC#hV_x$?x>%gBw7tZ|q^XJ>!S5I%8 zzi{s6%Qx@7{dsWr!HZX~zJ2@p{^hIZx0)IF8W|w>VljgbSZZSZ{hR6k-~WxE+tffO zO#Em1)50n9k3oQiNdk07mo$fnjFPU2iHU)lj0gvVf`Yu9jHHN&h?ta&yaM!`L(q6Y z2Xr13)UyMfc;NK!(*KJ8S==H=u6>j>H8K8kZ9lA-;ofrVtFnWGqw2R?`}!UK7ymC| zX8Tmt1zJZ{#oV)*;Y?$L)4!hoV*i;MoWM&9Q#iY)Eqn6h$&vZfS{?p7v;6t<VDmK3 z|JDC}z+>kI|9$`0{-5^W@86<E=4o4>{B3q%xWrgd<M7`{;*N{GrMZQ<gNv)1yNA1{ z1^0o;Qzjo2bjfsP*aN<B?g(Rnf-|EKqXxrAh82vd;9Ei(oEQ%LPhs5C0Ew-&42u}% zFieKW)-;AW3`-fdG&1Uxc%j6y7{eKcIgAnv9~vDP85rwCT0kp7Z}d!XV`u;k-GUd~ z<@~Q>o-koThsXbl|2hAo{(JnF`7iU|=zrM%9JYqVJ9g|?+~5eh*phKhoeM+5|A_x? z|F!?iG_O`?IrHES%d6+FK7IMd%EI#J>z5CYxwx2re);h9?!7xtKYx35j*H{VFIMj6 z28Jh1(kv{XyFWl(bQU%S78VwE4mJ)@3-bRzHntW<M&{-QL4_9{4A7G^z_WwWGL3@l zLJ|r(CMG6&N)kF6Obi+#%q^=SxfRx`1f4GlYY8+kNijTXY;9n=#b5%W{(+8_Yyur+ z3~mO1M@wP)P|mbu5@5In((s9)26XK4KhSZO??A^{f{vvGo%90I1!}2)bb(HZgq%ky z#BiapwSiHH!GU27R9|arD`Zb3tZf6+0a~5iz$gYjmcF%t(TTx<5p+~C!#~jBkf3#G z&{hh_CRqO!;V+0yOph1>KrNdFkS;KR85W?kHo<l=88C2x{B({%07S8Y!UA;CCfL?5 z&@(JSYsf(-e1cAtW@A9yCGYsZ?%$e5&}wo=hI>pNjSUVAE1Fvy9R5du$tc*l&?*d! z4D!$w$Dk9D_!w9i*l*mp@mW+MuF{#I7d(nIp}~QnyRm`O#>hyG>&$xr4VxC8mX?-= zo+VReO`kAf0)xYUiN*%b2iLB@VQ|qC`0}8|o8bz$dYH%11wI#V2Ez)5T?|JUt~B>^ zGjVb8a5Me-&&0~b)ZEDQ=O1$uBO_yL1Luz)zy2}sa4`LY-v_V8z{sG+06FIfbZb3m z4nXkCZvz8^1q&7|S}=Rcq$MjiGpuQ34hYbH)5!S(bocC!Umo58%>o{_5)u+ADJd}p zRYfHw2|f%C3_XpFJd7-F-Z04NfB*|)i$AzCrt;qkG-LGN=D*Q@EjSeVFZ5rac``E} zAIHB&mOuah{rlg@#KXe}I`g&}eBf<+10N#;)4zWVEbMIT>>NxC@VlsyLltyB6D(A} zN?;3BJp)augen&YEL1^@R?z|!oOdi37#XY?7#Kje1%gh`1+DRR_+KOOh3Wa38&94; zfALvDW6Qj4cOKrqa{R#RHii|A;vpfDXU?2CxOv5j6-(Ewd23=~V(%Lf5fRzUQzRv2 zXcwH372)QtspY`X#8sae7wTl`92Q^10J=d>oP)vMKOn%(Oh-po&A@@<*^|fb{&H|| zh%|#{lt7C_-hh{wK4Z8Coqh)`wtfTNO97ga*u!uHJkxZBVNdgHCJ7OqCc(cyfBg9Q z>(3uHVG$8w(8!56C^p(b$BHtxGcY!b^KprZi;0N}3keAd2#ImAv$1h-b8~U=HG}#R zjQ<%ML73$~=mw4saEP=pFf!CZ*Ghm^y@Pf>Gjnj<U*Yn<1iWd<=YI+7iu)WpcJ#RY zkNB_h?*|C}SNR{o)U#uaBWNW$NAt8<b7sz*)6?PbzmEIBsdWohu39*4%Hl-~4*$6t zwH3hUXev0Bl$1Cr{62Bw#BT-Hii!%?N$a*;zI5s7KOrHZ|L?9{T(xS|^adx;DX{<Z z8Je0|Uc6AW35Oo>!x3(y@`8iIE~eZGyxU>}OL>ePhXv>yz&Q*P!BcW=%ta|FxsIT{ zrrh9j9?d-?B0Mb^K$l(UfA}vUA@Tpi)jfOmT>Zc*BO}B5;r5XuM{cJCfPj~ijg5`9 zOF~pgNJw;QPEJmGb3S;b`WbNW?`7D+umaksgsfmk76;vpHG^RVBL^b`!$)W|-UVMJ z^n&39!(E0ep!<%YTYmmC{Dii7{x@&dXJh>Q=_?}}pSYALH_QKzA3ig&a7xOEbH4lX zg_Vzwi}n8>M$ow~?;bsP{`v2}FRvj(%YT0SZDL}9OkDhGVqga!EX&x#@V`y}59qKo zraz!r-k&h`j~_pN3JCCmu4MyZP96aSXoj39tq(m3Qk8*;0aV5~ffp&)G0vOk@b3`! zym|9>-F>DK5Ed53;P5{M+|=P};((Nd401Ltf<8VjCMGT>CZ-0ODhev9Dk=;P3|ks| z8JJrG7<#}hP0+e0&{;;H_VQe4fjEa@E4VnE0=llNk?R)&8xt!R2gm>a94+l^KYy`s z2r>O@1)skKa-Wt00|UZ+a{uN2=P~y6IsDti)7RIx>g+WU2RAo2hG~rg-+ugH`tjq3 ziI$ce(~%!yCO?{axEUFlm_bX185tRwxl&?$e0)7@ENpCT92homgJ+~c#P1&r6gwAE zmzhG>SHs*3x)stB+*;WJ?kN2LFV%JVpTOSSbL!ilKYth;{%vR!;9%q65aQr)v9i(= zy27F6!qF_4kdRSPkzr$FZSEN25@GM)z~I2Jr;+iGKoi#=h6gupzF}}t<9*N)03IR% z1@Hxi4u&fX2N<?6%wgzYXkY*>76hH@aHV-lBOenJ69W?uD?2YA7Yj2NQ!^r%+c^IG z`t^r_hm-LK=vG(gYJZSF^cWD~&I>+E7u4=w^6$jI6aQX7=NSY37yqwe+x6_tn>P$o zu=xXgrcetwm$q<6M1%*&79^BJ$Hais2~B;|G6h`5fmRiQ*1WhgFfnLBZ>17{v}D%K zGZ!wMKY!`azAc~rJh^uF-nBEQZr%WGF^Kse!_nGv?E}b5vl<n*UApo8+c!=nGcz+~ zp<iFmojbRC$)rh>m$4XV8*|;^Gqqu9R#E`n9#fGM?dKDelET9yAiyWBXJccm;N#;X z$|GTBU|_%ix|fqdrbYTM=u+a3UjzhrczA@s3%dS1*>#`6LWJ|npXNkH1_sc%QK0C& z!f=z}K6LErCS>&>Wc3!qFVLmG;L76{!wK*SVZGpH254>Q4u%uWOBKHT_{}9G#K*<V zz{bkN@bA;Jr*D6=vi<$Yz`@SJ^n;O&qXklO%wy(YU}S9K`1j|}-@kuYm>3)RK<l(P z*%<zO`OUz=%>1WiDI{G7FfcL%FfcHngyO9^lQteXaq9T-Q@ggUdG+PaxvSUC9XWLI z0%YNR$p2dQmUE!ZMht6+3PuJU7sz!zAX26xJt`uupg=-GMn+2A%EQB6Cn6$3Q9=b& zUW1!6LpU@+?N(TO9M(#Pv{o1WFKKLG<bXA=Wk5}NE>KgRr4ib~2IWj$XsZx(HaMtt z<@)c;zcc@3Ku3T7i(%yAa{eC#hA}KHhc0k2IQ+ZT$PX=HI5=F?IIalUm^5?l*s)>3 zf(<P#4Gqr!>;Gr|ulb+D)Yi=4@ZYA9N#M_)CWZ%%Y!7(VTo@i*Z1zVf%@2T2@jL=P z|7-$7149qPy5`CJpp`%zOgx|qfB(H<;o@j+W%$;}_U-%EFW<iYY;I-v)5!LNk&}nv z*Ux6?9Ht2aBZCfxUyl4c@?Qj0zWfVeWMYDi?uPuYVcB(piJ=0ESGbNG*|TQNo(U6r zdb*wdm;UegU%@n~pTXh31-*O%iWSh!?x3?(L9qfVFJ1pT{dfAm>EES)m;QZX>6vxq z$`u!I_f+P;@_)Yuhkwf&`5^_rkd288Bx0Hc5)x8MN)l9jTwPpjY-}}6zyl(nf|BJA z!~N3_8krybQ+8?gM=AEfF~EQlE6tNZN5ZnOFtPD)@v*RQu`s-AZe{-V_2;)nW>Azg zw=w<t_NS5g2WYePWN=9d@&j^gfc)V0-{`;5|3&`}{X6vU(f=Cet|Lc|xPWgH;rTE8 z->!jS8Wuk=*3^Jj5Kmy3z+K~zk(iJW5fSMcKo^fdN-I#A?+Y!hEE$*?R6sjPnV6iw zmr)eSHFVv0%Y>^6V3^gYXu!f^qxSy}mx>Io(!ZI_!67ClCaeV1=xmmBz*Pf)%YCjV zfBt;o6tQ5qvqh#w5VHnoP6Qva0V&I8GE87-Vd!O8Luy^nyi}3x-#-raKR<Xl*>TkX zpc9JOc*HoreB%&?)B&K@Bg3CYu0PDo91Op|pjQa2kP4w0sU86B#s}2{@R0rW%lUs6 z7*@zOU3mHnSG@qL2Z#t-Rv({?jEp2u66#^-XY@g?7KAXX1#o3BEP@!E3qd0<pb-?% z$Phd9<|)wS-VKoPkSUPy5EaOH2onR!cu1H6BSR4M-Uwp`W(Lq+B~cO3t~@4C^#Z=X z2z-$ZBa`$0sQ*(y!~D$mIXLe7K>K?o|89Ver~P;1U%@|@e=h$D{soBqxNzY|38)|U zL!qR?_4kPrzg;UB7&USn81`^f*r>cf?W@JuaUl2A7|X$(Fb9SXMiUbUh7NI1Ck)mh zJ96aq2Uv%!Ihx@BxPNp2+}pzJYs~>4yNoG5qj|nG)1M#zq(r&lohms=2%CkCTe`WG zi3PMQ2i$jJhxVOXq$M~wB))usca^^U_yK4CfZito3Qd1#Xqq60CMYbKKu39k!jchu z4-^N-{Xke4{=fg91t|nUA)59->)*bAzy1Y?Km)SmH#i(CTtT7BfWN=X0qXC{+|elj z2c<Z!{wzF<o1;nXz`}yQdA>9}3}N933PU+b?th;?{lne~ZI_1iH$gM!FgB>~2?}Fq zSc)q!GKe6ZmCvQX!obSH0J?RVanBv6{|x_g{`;`-2yw76u=&{7`1nAEtXM&Zda%4{ zc4cS*cgI0}oQ~#BRx=A5BQvAsP9{bM)&>R^MiCKk-T|GIF95Ygh=G{_WDC=V3m2UJ zeF3deYhYN_*uc#8=g+SewuFFygoFgp3`1ixgG39O1?)~P9(GQ442v3BK|N<4o@Qny z2397fHy{2qfo&3GU}O+cK-^&f8na~o^CzLBV-v%g#s-ErjSLbkpvwS2N#qX;XgMEf zDqEu2m0=#kB5>pV1;aeh?E+uEF|aT-cQ!Dvv_sFmp{3cN^Tt7EfJibx_Wy!fk34pE zZEbCxb9a1Wv13@;$OUSO7)XA<B4lIQ%pDTq<KydW>tYff22Oqq4;tAY{F5>Ow+g-B zZH^rbOBtpyz}kX+3|x)uY)t>ZzhdHGYi9V?$o}p7S5PzXM>E5pM)n{7*to#Wz&>zT zg3kL#cN3$Yp7Z}QFsx+jUGeOT9>XFumlYIbWMsxiCIl2iM%-xNG7(U!RbXJ?h2B&F znsbL7D8g{S=|9K+JO7R~Ixx&>fQscfG0tIF!Nk)Dn$c$psi*+o8O#vU+{r5O@87?F z63v|q51JVsK<}tvVPIqc^#V8;m>6KA*DVZNnj0M$4H_L78k!ycOEoYsHMTH)V))nC z!XyGB!6B9mJ<S(X3xiH9RA*pe;Mu`!tuM0f@}nJdTKboPPDs}Luk=6n|DOMa|JDBM z{*U2ZHMwKKo@duLNf_I+GxRsIvax^uDR;`{f8KwS|3?1}|GV*YoRa(Sn(g0zNs(t( zH7*SM7%nqhVz|gKjm7F2kKn&%j*?7`*H8X1CzrT0G&AgEc+T*Gk%f_w;V?rZV?nJe z!+wUpj0_A<7#=fh<*YA=|NrB`a~04O(4I!c4<8<1H~}7dRu^G7aqi&<4i0fGgC9>W zo;h>o)(-;>QI6(B@Iq+S|BwaiVc_-B4*z}r$NkUvAM)SnzbaT><UdSB+<(yN{SN;f z{)Zt{G%pn}(2)^W5MTz~!Nw+_ASR_1z{J7C%lM1&7~>4a2FCe}XBnS?;YP*=#u<#q z82>QwH!v_ZDl###vB6e7fKD%C`u7)fc-g-{fBrH4|M!oP>3_5GjT_glT)Fe;$&)7! z@7=j_4ZJtx+Lb%^9)ix)xO3&owHpj~8li0^E(S&h9<<dS%p5EX{f!L_ADWrI`~i>X zG%(0Cx3+>tXj_{=7g9o6u-*!c3=s?r44@k)K;v@K3@i-7Lg1PlG@u0<(_&->jcGak zH~4q!e+|>66H7p|dourBn3gPQaQh$dU-sXR|FZuB{x|$P)y((%%o*F9oU`-h&EvPT zvtw{#_`=x0$iP&PlM~9YpWzLo3}X%$N;14*IK+?x-pufYQH3#(aS0guF{&_pVOY`N zz{JwnEY6}D5D=is@_5glJ&z@9Qc_ZEB)*(EbLM-qGs79sffo#C7)xrQcLNI5mSn`l z#ANI_apT5~6MHr<S+Znv^ZaIU7KR@`elW0b3kV2s|N9QwLHCcDi;Ih?d47u+n}C1- z8+dQ_Ul!2y4_qw&e*F0H4_cQvLC?kqt%T8GU}g|wU}0c5;0U@!QEcLY181&YJM;eC z0|iNjD;G~3Jal6BR)(%d);9@ZH8nME4DAe)8Rjy~VVKP@hhYMvh+Grvw^t7yJOtg6 z(gMEDW--GOh8CgpC@%|7Gm|Gj>^yv8vI=tws~8*@jx;uS|4;dE1)U}}K&Bb5F!qRB z$O!-W^M_kjM@L6i#KblrAizmaK|w*MdA9g3K6V*7X>kcjDREw*UyL8$ef;|4+n29Q z&5aCy+rj4|H8K7F|G$xewYh=!$-M^;9^Ais=gyr64}Sb>V*Jn8J{yuQKs{yyq;WaW zo=t`m&i`xw8~wNZpTWCr!PGS;K0Vo|V(%@?FsZSTMM~_2O|1*V9)|M_7Z@%vOl7fn z!6(Al%ovmI%CL&zCBqwr3k>HO=5uDo_`QB|<~*Ax18DNSk(Xad<HMb!d-m+P@Ipg| zt0e%mhva|gf3yE8|3&`G{nvx80Z{%g@?Yh@#sBdC8O>7!UcG1F_{SxpprWE8$@Pzo z;Uj2w%kNG`X6BYg9ws)9KR-YReEs~x!O{vHXLN<$CMV3m!~mKr0?lzb{BvPku)yb^ z%fAi(7yP&Q=kjmOzcv3Y{yY4)_`l%ahJP*%4u79CGKYj5IpW2z=KqQRDGWaUb3hwC zz@*Rr6owPc{!C9m_m(j|VKQM@z!<>vgvo-*g3*W3g)x9(0h0;SlLiOomPXJn?-It8 z6t90z7!nvc{<kpv`1j=B6A<~og^`0Hp_%{98y=oDCO$`E=FEv%bHvA_c``rf8fTdw zFL++a$h?r@dGVupGXIMg0s<EVG~Q@jxuS95jfMbhghPOVkwFkz25>MiGjM=c%Q-N0 zbTBylyWPkn!l2RY#OT0qg5gAi1LKQErUxv0n%mk~czAdi7#rI_8@Cv~G`4|DeLf_! zKs^IcZNz$jBY=ZJzL8mgK|rRNG3SfJ{~D$*3}+gdpRhc+(A?e*S}V)Z+|CSI+t>^_ zHA{$rkwF~lCN5AbiGhWIb<UDGOO`M={10qoP-$dT5ovZ|Siu0AxSYW-r@?_yrIF<X z3(JWI%^e+}%qakJT?ZTZN(Y8FjgZ+S<nj*YKIQ`lz~!AvGgD3uxV&RzInvzP$}A$n zz}VQz{NMqi%malLsEr7^2N9;9WyJ!pvmzRqRa6*MnnBy17JzyP4GxSFjm$@mup9w- z64Xd*Zf6Fy7Mt54IVE3#kzoY`0|V&9dr(i+l7WRmMVWyKv@!!UApkly0z2KP=(kDC z!$a)Uj2WlQGBV6w?bz`OM#IDz{WdkqM{qpdvE!*$1dR6hadpLtt5O~?+8LAr!An-W zy!;raF-~K2U=)XJ&}9^7bYRS6>}Q<7*w2{Buz;mJARwUJjbQ=9Nrv|f9~j;<oP-Gm zA`9X&p}~RiK_m0BsHkPl`WrS}{iERE;Gpp5>IP)?fdfx@3<3fI40xU%KxQ|yyb}_7 z*8m#HXfSA)GI`OO?MIIt+rDPe6lAuQwO2@dZcc7|h?g}oyLmS=&zCPe&H8-&9891C zJ^wIq@FBB#xLN-F`1tALkAE!O$n56b%pU{<J~Zop`uvN5jhl;`o#E$aWcIhOznD09 z`FPlwet$t`H}8hTFetsi@)oH51j<`Z|117)`CrlC@SmxX(L|udiQx%D1H+RB2gVhR zOlzL7G`F=efo>9N16?G{@CKT*co`TOK>Y?#%HxFINXB~L066V3nMeq<uz=PQf|D=v znmbQen%mn!CrW^la69Nw2T&r0<ShXOMg{=|1_n+B$i1N)3M>qui-4J&{_FgI@n52W z@duR8sKIc7@k;}v0Jy+)VA#>z4q8d{uelx6sR8Zhh4?a#0n(?pV_;%%V_;@b1f7R* z=k{^XDg4*o-TD0c%a<=IDo&8{m}l`FX7_@Ef&!x#SLgIKGW}-gYZPW-Vg7XI2OAd) z3(L<>KjzG_uyDHP^dGcfJBMZZ^)GiUU{`8RV=iD2WNBto@ypD}$jESD=#r_kuuu~b z5vi%k$;rvIu}}qVrxlj5l@bvVQ3o&XVP|3a{N@jXoMaQzhc|y3h5!6{!RF!N;jYE- z=jx6fJ6=AJ;AClLxpU{poEDG&HUH!O8$*XcP5#IIuK;h$1i2*RKdiy$_dnx*4QI=o z9XoccT(INFo#y3?|Nb<}{{ZchVPa-w{`c-32M5pZCoi7A{rTqyr?ixem=FW&pXNr^ zzkeBi{r=m;!pOwH!qUX>yNQL7;ScEWxxbAJj4h3zvl19tn41{?|7&6U!vrcaI2zf1 zefjbQbbeUNa&Q@YhJlgcIs*ekE&~%oDg!fvHK=W|rSd=Df3^Q%|IPo){FnR>nt_!2 z_xs<uf6M<h{;T;{{V(WW%)dSV7XEAbR{@6e{%!kr?cd#h&;C98clO`@f9L)SfXCy5 z{)6t7QTi|aUllaI{om}r!GD&2=l)Ilm+>zR42%9v`*-6%&%ZDKo;5i9lWJ^m`7iPB z)c=<M@&AjsxBTX^sj8}R64Q23bNu(^zccgl=l{MmG5-GH@;~8!=KtjXDgV=$W}RE* z_`mvpnUG&nmYamw&wKao{p4X{xv}|zOh8KtLj%JeMiYiL496HAFuVls^?%8z$f&?5 z#~8^N!5GPC#%RH4z-Z2B!)Ob}a*QI3JPeN+Kqtc8WjFvneWaJ6hoP6zO#-y%at=cm zQ*BMHFT)Y=d1ca!ag1{r=P=G;>}M=z3}tj+c)}>t;J_r)*uYql09s+@@jw25`v3g@ z75}}VZG5}`8UJh9ckXd<^73=xYhvW#@nJZ@a2mWK^8mwoh7N`@hWm^*{{{Yw{Euc{ zu;2-26En+;9lehKv;NmG9b)KdVQUaL!J-;c>cP;*FoR(gROc#&84PXAaXw2X1pY4q zpL}iuO?*oKHU9fR_b)hr4|C1<U(ej(5|HV|(8e%>VGYB1=+xUehBXW`7+RUa#P>S< zuVFmV(7dm~^3JJuFJ685&%`Y*A<D_b!Nqpr-iP1+{&8_IGyHq<{Kbn`Z@+zd{fbXe zh?kA+&*x8H{(!m_42*0dY~Ty1{{L@cWd7g8`0IZQ)Bk_J+n5*`{&h04urzV}{mbx& zMSzdtUrU3Sh`@u#PoKYh^Z3Do2ajI7{_=%~hmVhkxk-qbK>-A0MMP9hZrptG;lm%M zCJx3wU*5fZ{gvTO%RWfC5zfHK5Ds0Z51NqxwUQk{x4SZ3xX|PCZx0y$`1j%8n}3h~ zy#g)w{V(<3?SC25#GW2UP|KF-&K(Aae`gyRzJO~6<}Wrj4WO$)KwDBH{)haJVEpu@ ziRt$GCGC!kR~WA_3J3%-d|`Y8hJP5JFn(aX&-jAz1>-)(sf;riGZ^JS!+VSsj1^2a zHVh6-42=!omHG|L5)vu(pfkL7Fo16MTEi&tuZiieUQIi5MMy{m=y=yH97nc-ZWUhA z&;VUp&D6i{fCG5pI%vWA9KL^IV*fZ;-aLQs=<$<h|Nb^IGyVDep}mdaPbVW2Q%3{u zix&(mECS#i>oP2$aV(McIiUQ`2wJc9hk=2imVt?(n}M0ZnSq7D1KidHT^<?-K3>b^ zzY8mP&r=6ze-vml`I$4G|1-e5b))}>{15u?4JmzDcI?=(yvOl>&HrfTA3t8N11$?r zU~Sv5VZ-tcm;V|6jsE@l_vzms#ye+&{}=wx_#gP6^B?%;xqtir-TW`{-{imke+e*@ z{4esK>%YwZGNv;h&ba=M_#gLQ>)*fseE)-(_WWRQ_%GDR!~#0i>QfV|ifKYZf_)2& zF9G4R2y3{;B?lWT$Ov$7aA;U4D3n6ZD&4@)E#M);^6<cl85^H7FoCw>zuoBmU;E#d z{{{b({zpP~9W%CFZDs+jh$(PpXo9SQ<MHtDhzjuz2?*ff2?%iqukDz`u!Lb7<n%|T znwlC%hKURvjP)TIpi6Zb4H-)q=P*uUj07J&q`?@<IEir$<1WUBpjsBJ!isSL;}s?z zCIv9$WW2$+fpG)l4Ujw&1LH%+E=ChZS@89|txOs$8LkW$83h<k7*!Yr895ppn0Oi) z{&cV%*?Q#2ktZym)4e(cz?`QF@Aj`+ux#VG4{TgbEaE~hUhHs&mNc2%TV4pcBxJ-z zI4S)3)WrC1hU35U|0Ec5B0%R!gAyR<B43AQ_6-}(efjd`)*eStcb09(sT((L9J&JL zaDMoJBFP7peD;S&M9w0n#EqekVFz?`z-ERv#+)3`ezP^8?g_&@hBmH>j6f$FBe8c^ zc1?mNX72U{=RRCGv}VDA1#6Eq@1JGQ!^6YH#m&XX$0sBrBO@cq#m5J#txyG-IFubc ztTbdL#CX}*Sb0T6L}WB|bk(Fqg!#q9wPd&$85qUv;_@<G{$F}0;^u26@#k0b60Tz> zAAI}vS6*L=pA}S5GBL3=@i20VXe<2v^zq?|J(oW<vHkt>^u~=R-<lY|-fr$>{Q}x| z_p46;LUa84`su@mPd^w~n43gE+k!qnc<|u)mp@FPH4nTz91Q=Oxc|OCw?RZe9CURN zPxJm+kkaS|^uC#J1}26=24)6F1{Q|Me=ET7=zk_qdGp^EyhXGGv_u<>K^x5E|9t?# z|7!np{;T{~`Cq}@dF05E`2RKk9sa%hx8dK4{|Wz3{d@NB%fDOynf{CZ_x=yM1EcuA z9Z2=RJO38^n+m=6`RaeU|B;}4^k443P=mw2q(<f(n|n=;|5N{`G_w8s&mn6dQ3x8R zoxw1JHQx?2VCMw7_l98>XQh+cpFe+$vZ~gA`ioU;vwGSWK9$J<?TVbm_3xjuhlh$= zTy#i;149>MMoe=Qc(=(8#&wK&pz~50PBU~fbTO;|_3^;?1;ZCcHpr?lMq!2@pfisc zo-nj9rKF_9GxRh3VDw^~!?=T?gQ0+N3S$jp3Zn(17z1e49s?r-qbNu@qXlCI<9x;w zV7Q#IiZO&SfH8+Lgt4H(fk~&);lB>c0-mITf<_i4H$Ukspw)bkQv)lQHtjgr#5rNY zgmo+So;Y!0mBaruo(Td42^uB_JdduNn=qk~TT(~t#pOMlHf-2%<3Y0nLkstZE1Q-q zX=vz}x%tKicLvb1BGAcWD;U5tm24Fi6(J!ZMQ#ie7*>PF=+7{0XP72+g+YTugMo=( zLBlE}q@p6z-$X;`<Gm|aK3w_IyuVRYi0ALy=P#I8SXo$E*;quyr6h#8*#0)EN=eCz z@NoS4_JdVO;?t`)pWeOx@Rv<QR*K;t6BiE~x1f-KfP$11_z;a|W=3Yv{iiHVOn*Sv zII#1uH!=PF^QW2h#~&s(4%TM2|9}56{QdK<nc-hE>zxlwLLwrKJZ#*&EI(d=jx_)B z<$II(n>TMhfA|dATKen_gMa`F2M5!yA3xr_Y2;?+VEOa&>&FitzWn&pyuT4tTQGp; z<~SK3t$QZudSfSs2MpU7dYapu{;~Yq_CKS!&52PB1e@F1+CY2#njyV+*xoPDdDkGl zpx(PPBNtS6yYt^5sQz|mkZureZf|dAW@BSxgY{`)_Jc}DP>+X=frY`5;R8b(Lk!6N zod0tFQ^3~#`SGK<4b;SKZiD1MYv{T(bp|E|MFwUDVNg8>zAG?@VG+X*hBXW^3|koX zu*#@ZY27h!U}#`ek!fa-abTFln|4nu;K)1{mU#z!#O`D`Fic{QX%?KbVnxT4mKAH} zJh^h^$BREVt~_ZLym02gk0&>HSpNLs5V-N;$B{D^ngbc;F<fKV#c+$^3nL$+0izJ3 z7o!)W5TgMjAHx@hTMWAxt})DOp32T9A@GY$;LE#4_77k9n0^RJu{Ad{Gco=9*TVeo z9}`mx+m9b#{{8vI)Xc{8>(9S$KYlb%1^bK9nSqhfhk=2if`N%)I|DOAA_EHp$B7eb zH=KL*>eZI||26+z{`3Cl`Op1d>%Z^+i2tB&nErnc&}`8Eg#TLqe*8P~Zvq&u_;>K% z;eYG?&G@(I-x1It(7z}DR{tydXY-E@43+;m{&W7P@lWHQ%fIe_`@y??kNsN(R-yDy z_n*!`?SE1KX8c?C@92LX=qf)yum6Vse*D}2ZvnWVTk-Glf1UqM|HE0Q9zAm8+!nY0 zHUHiIYyCF{55K1}u3>Qa`=PPH33ALQ^NQDEsZOA=4u(0*X=3kIyZo;O)kgnQ{#P@v zd@Ys+lS>tQz0&1>4X7adpZvd?dDUAKxfP%ja+Ck3G_uHQ@+nI;u}CWOsmnC6$ZPW{ zOEmFFD)VW}{byj5(*R3KDD!E^v@piRfc8gkWLOH`rqRo=jo}W%KSo1v;Umt-!KlI* z!Pv*RmT@6t2V)0gC*xLdwQa~`z+}KA&cwx}#uUTU&$O0l5mOIS4^uDGR;C+Ff0=ce zb(nRSg_+rym6#)#BbYujbupzfr7)#3bu%4gy213GS)DnMIe<BkS%>Lx5K|1}cg8Np zM8*WhM8<B$!;Ci=KQd`D1u_LN1v2R}9%hVS_{`A7l$w(2$<WVmoZ$|`S4M5dK*j*Z zKt=<G;|&hXTN)djz|E6s%mG{<R)DT<clhtXyy62_fD6Mku*?w#u-sBSa&Uc1KX3(r zt`|7MaHNq%P=rB5u!%6$;_$!5V8Md*r`|FMX=rE&F}yvwegP_f1BibTA-`e40#GBe zhG+IQ1`*H=6lNj}*JeXo3q%My{I6-=zqG;r*~|Ce{<8^+OUVeb{r~dn>9c3AKmTJB zl#-GaX8Zf;<+Eqc-+cYgCMYQ-Bh2>i<I~5_7??RZSvZ(}eEY$~&ce>Fz{0@J&B?;a z`2EWdW)2oM7Dk8y#&2J~GqJO<aj-Qvu`si;Ft9YSFoWiDTbLLb7@L?`7#JCwSs0lZ z8JL<_SQuDXnVVTy*%;Van^-_4^4}&FCME_B_9mA9{~5mhXkuYuW8h$GV)^%%;rHK` z1_K2J30`J~j}IO^_{hM_4?3+LnJ=NBpdi7Ake5(UXk=k#0kud#cTuu1H?sam;)0xp zB-yfmDYztOWng4rgN}iMN@LKDm_~*pjV+B13`-hYAONhA4LVB)Dsy2fnYJ)Y18wnb zXaMb2gD7r+tL8v57c?)-^nszGv4v3vydDj#xRHUS5uzTuI~IW5aRS91%NZCMHZm|U zlrb<dL^3clM1e+<|NUVE_0~lGJF)id*|TR)r{jOO|2m94J>LIC{tNv32D)_~j9>oy z_U|ufJc4o8E{FdDTniR%0F7^LTF~F)1KtKw^FR1MKX`xci+?Zvi~UdfKjFVXgTuci zjg8LWo=(jF3g*oZzL+{Qw18)aRy47(FnoFN@Xe2Qw$D!<eEGx7)Z_$_VX4yi@?ecK zxX&H)Kc+c>5wv;x2xAYUGs7qFChjW?R~Q)>of*NGt1|X5&SgBt_yi0eGhSlc!?+eS z=>%Hs&p3f$3ByW;ZkFtvoSYhehUuV{<BSs+Conu<lx2(ubtf4s7|R(A8E!J{VVuz5 zz!cKh=mc(NonWbv`f+2O^Z!&x@2rXK)wLTxI0QJ`+4%W>+_?7Wa}(&E573(CYUUF+ zegru)tcGZ8=4@zKv0}xMA2NEu?hM`Fru!OblYSLjvVq*s{nHv87%nh^;{O7BLqo%| zH!^x59t;y0c0rY`0c+}G4>yqec?5KMbqnjCPcL44`Pa(!@5_r9?|=SlXZ!o<#fuNW z|F^P&L_Ym#Gi73W^5p*AH~-kgloe%USeTgESQvhN`|$@fWX;5M>(#g4OdR~eqVhUS zGHzCS(i{x$Z=Kxpq`8%uT||PjjqNYHga{YIzjiiWNeKxF0rpl_PEiR7ah|qDP-9$- zla1l)^LzL1F)=ay{{DxFm4%6csgZ%HQS2WR8_U1nzd=_t-Me@1#kW69f^rH93e7F7 zEPN6YJWQ=@Ogs`2g6vG~Y|MNT5(2D@t*jssJ{CyJW&r~u!&U|c20sQS22TcNh5!Z@ zhNypT|GoaZ{fqn8@^A0Idr)}f-?V>a|KtA0{fqk-_0Qp-78Dx)v-{@;TEoh?U_t1= zs{dO5b^g`-TlnujXfYB9|J(Dg>%ZQAoquirD*pvQVf?@128VwPjg1@)4Gq&y|KL%M z0<9TqU}$J!W8>!e@#*ug7EuX_88c>Ve8|KilaZ0};>C+UYz+Uo#G9iSmoTO<rZ6sH zjAr=E06iCgQH-&iu>maJz&M$4H{%T`JjS@5aRK;zT@MczMi0grjB^-O81}P-85kHC zxH2qc<X~LDxPVcI;R-Wo;M9>}2E*?L2PTEaMrZI+k2ef6m<<Fz^f>?5hfHEOvAurq zK|oTRyTz4JicyL&4-AEwDx@B{|2O~F2Zp!)-THUye>~GOsUk;)$Ba^-WVv9$g8e@g zjH2BcCWEpE!v<J-V@o$t`f~s&S@P`JbLY;TcYG=a!8M@um~%ia3D$T671nEenwK&# z_BV3BdiCnvcLo+N5eYG|CiZ`S8UFoeWM*z=V`6&q=GDhPjXW&ke0;xtePLwy_nU#G zxr32~sgvpNpMRi1l|}}xR)*i;!|WQxH8eD2xLN+ay>so_wSWKq{rLKefrW*M;a{WJ zKOG$#8yjsQmOoDp95`_1%$XN|SOk@InmZU6Ct*A8g^7u&8Pc*-V_;-Vf!<I$lYyCG zAp;9T{lB#TV*iEy)%{!Y?=EOX1sFg1x9#6F(9X4gb^ogVCH(V(!r*^#|I+@=_%{PI z*8T6&zi<D3{G0Rd;J^Q%z99(zyYp|=zhD1;{9E>K=Dz|cZ27nT|Ga<i{(bu2_CN8z z`hU;?8X&Cj-~WG}BPdEZ+q#zQ+O=!f#%1&T{~P`1`_J<~<G=HNR&YW4;NOG)8vmpI zbN%P}ANN0pWy+K(QyLuphc-C;<0B`fHbRp$N0u4Km%Gaw8XB5pe}DbL!N<$S@Zv>A zMuxw_zduiA%$Ok|A;I#Cf$`hR=6YrprV^$SW)`O1Ou<YtP*}!vo#_Ecoaq76XJ#2@ z3n)}$=4WPL@?r8}j9`plTEVn}X$?~glRV=#P$>(-OpHt!OdFUsF!eB*fIFO^Zs!lC zXodx#)*!<IhL?<i;8q~0C8)=6mf?sCSmFr7MuraX#7SK^!&HVP;1g+oFe)&%GQMLH zfk4J3j5gq5K?%k}#ye2BhS9UZfq4OSGf$&4B<KClV7~A{pv0NsA|z)vv5P7Qe0cuy zD}x&-ZvVA`;luwmjJJf`8TK-!fgvc5N-<1j;=9%4_+Rkft!B=KrbTF3aTCKOaAsVC z$cmR3o0=RLF7fQyckd1?E7pPTsh`6z2bvXK8Llu~V%Ws6g<&(p6#i%vrJo0vELqgl z(z4>6f>DGE!(@hi3|AOtFiaCFtEfnGGf-i?e&gD<9oxUE82HyZFw6jD<+%)u-Jo57 z|N9$wS>7QswFFb65G+@N_AZ}d`|#$~hd+(hEaH3ue<1n#_X`ddDLFZ5K@OIGU*3QE zz{bJB#m&LR$-&BM$0Q*mC&9zP!Sd<X4<0@db`CCHeg#~`KpVsVM#jH?K@<}+3sWoO zzrT$P-&+}28yT6ITI~P*QBhNq;$-^s`qq^zmwx^E^Y!zOe@sja|9<`X^Gi#^!pcfh zfa%wxeft`EPMv!8i-})R>&LH47cSj>`{fsptg@1_%Aa4q8JYiqj_~_&=G?wLd(S=p z@<-ItqAW{CSK!Z==hx3N{At8fth6#Pb}{^Kg%&!{b5lU$@?hKyZoL&VFfvp?&rq;n zU}i7?&HgNK`FG*p!T+-V!~Q3*E_w3g$&+oM0hNgVQvVMByTG(yW{da#tp8E}ZNcXq ziGY)t{C}JOVgIw3T4pdf{M*vV^yJBAXK3Foi}`@XDFbJQPRKpUyb)?@a-iF?1pb^d z<NVsh`0;UbBEu5K8I0A8g^UJ_3=G>L<F5=87>+RtFzPYJGS)Iq0Uud%fRTaGfYFUH zhp`0;OBnqb4H$(PPB6@Da9~ntWU{bGg7konuv8jZoZIF6zx2Ny2=Y!lcI?bcCMKqT z&rVs$u{AL=OEq)7dUXO+!F&_5OLAeD!mthuyBRYwTp2nUb}(E5!}Tn=c4E&LLAxW2 zGfy`!Rs8b@bUOB%pIqOVMHLhj_}JLknE(Cx_wUy?E;bfc4i2W@&7BO4ZJ;?0(99;| z-+xVv%q-1{TwH<*3JPMJTtB|NeDvtiyKmpV|6yce{QmI^7awSF<3DS28v|n>BO?>& z<{IdEiHQu14A~3}3<eBL45|#w44`x38GbnaH~a6w(|YvID`U`cwPvp_ZFKw}_1{eB zhoJb^OB?2cClGes`Y*xDFt3s6!iBYn?sOUR9*#HOpdR4@(2PApGmn9Rr6LOpi<H<q zj!z$(7@wVMX5evRcmrD5##J7odU@f31q*KIM}c;z-eY*f%EK(<;+Nve&<b9oJcD5- zLnmvBlZh}hc#4!MBqYOyVJ@`0*}-h1@?n?r|7^&RG)vot4bNDcSh?9gs4#tNV*D%D zEOOz(;dP4^E!zF~2aB{zd|bSpii$(F6KGcyLknx7I?Ipi^PT?J{;&C8%Q$6s^D>bi zKR&&B_UzfKuS|b<BqgP!MA_IlSem$)S^hEoW9H`JX8PW|Oo@+A5VYM)jEn8x*BAF6 zJb3--({INA4F4G!|FJRr|IhHBfdzU4LjiPGup<McJqJ3EQc&mCiT%gVT>k_*-uc6& z6N@{V9RAm^c!a&$H{11pG<Y@>bX!;k%lcF2?z20B23VL(Oc)&gS2Z#(QQ-d9#QIOv z;?#SVCKge36&2XH21~8d35zqX|4X2mBm93J^AaYeCCv;0&WsL>$_(!r=5vJ^vx5%h z;xP2fcVbx2aFgK%%M)e^mn1ia_2BtS&|cd;3@ywBZt}X03_BQhFr7HT;J|RE(TP!n z;SIww2Ad{U4h4%7PyRHqyt{Pd$P{PLMydZc|BG36oUt&fbcM#uVun2ob3p4ko4HS{ znb+0W(zxu6gk82P!&-)G;H!UjGITL!Ww|hPGi+p7$FPB63Ri-i#IM7kar*-=96@8) z3@@5zGyebIqsAd4CMG5z#?8p{hh30|flq*wi%Zy8MPHNu56_o(zyAIH#lR&c#ns#h z&I+Kb&G~tn7(ah(Wcbp=$ja8p`1xxSBNJ1*vJMX)`>#*G7+E;J{bXYL#l-OA+qVy( zGl72p;$Y$f-GMA8(a0dt+`x3}?cX*=M#gSXIn2b=18zkzSTQg%m@zOgh%+!Th%+!V z2!c+D{Gaka;y(-HsxOZJ-u-*Wc<7MJzdir{{a^Jz;=fk|Xg?}LkHde1Mn)9|&><oP z4Ga>E4*v}p8k&6>PB6@1)L>{~5COFe7?v<BVUl44?SEdvn9$(BWYFlyu!J$Bk@W;a zP7cG3Mn}dFh9%7`HY*w$WE>dIFfLf&z;K2|rlDblP4h(F7dJp##a_H%Vqs!=_M(~b z-@h&fmS#p7i$>NT3<3fSKN=Y=WSSv2?>u2(WO%^9z>v?t#8A$_%#aJ((R1gHFZk5& zy8m_mX8k+x?<e?3KG4B@4F4|u+r-$_<@s;cziIz!z*Fm>3HFkI&HtJhyL!C-?f7^3 zKkI*ONGAO6@L&Gli+{%$+gd#T9s0NP--3TVP&oVF`hVLPr%dqxU-uFBKMe|_{zouQ zndJW8=ij@3+o16If0qV_e=dzJ@D52NwDs1+%F502<KwqRU9oA?rY$+}jDbnWF)c0a z*|TRK{;~Y~%ONUeuw~1Z{rCQS5w@|hIdI^>gKxk1^bMLBZEWhnt*HkL4;Z&F)-VP# z`aoeZ<1|n=nBf8A1ja3lx4?6)p!wFDjE5MvFg##*z;J}&5W`1C1I7d>)MmKBum&W< z=)vg27|oagg`nO?3RpaW(T6b+T9>pihA@VJMBN!{7!w(1Kw$-A3%G03!fj(?V<ac= z;n>L+FJ3gUzIpUPKu)AdR6s!B<>^}j3`S-W5)wK(I&M}B0&iY5iahx9=g;jcf4)e| z$jDe&Sm=KFbM?W4W`+hwhD!{WI2#%kELgDjtBhH^JHs^St?Q8LW}Qf;naryt4GlYP z+_>@Rn}C9mXLem(oin8RWN4HQFj8Q?yko~34h{}}SrsFDFE6jGtSlcR74A20K>duV zO#d1FFJSoJ$iUcY53cM%gZ_V+SlET6BqW%anEw7@0?ijNvAlct=KZ(-OiZi-q5=Yc z{`~k2YM(H%v2gwR_4Nnn{Cz<_PQG8izW-%nViDqM?f~U97UoXI-+x+}n3$Lw8QIxd z8UOwPb&6UUnOPbcm|K|{nf`okZQ<tO;o;+E`SbD9pFe+^SigV%!@|SaD)jHqf6(w4 zsBOl=!p6z~+JVdPqlxDq=m=pJ@MS(A<9_@AU+vZiszDhUL5Hg|GX8IZ@ERHa|7&Fg zEgWTP1@-6uwSrnQj2jsk8P_u~Fq~&#Vg#K*cn#cpYWmmoPwt=dzuJHEps?j%=s&Z6 z)Ba8SC-+b4AH&~QQ26T~$3HgEYJq<z{+;=E>EAUdy!h|Tf0h4A{|@|1`KJekasT%G zoAqzbKbwEy|GNHd1n&<A?Ga!8FZZ9<zghog{B!$f|4;p&h}%CAFjW3$`p@cr4AX`q zFPfP?zGVQ{7K|^}x&F_Bo;u<4Kb^5_hCBFh@&xek{Gb0?|MOWlfUXhP=>Na!ztg{S z|IYn4`>*p~8GPH7!hePT%Kw%A%l-THKa6X_-0i2YUAuPe*zN<4|2_V@G47k;`9J=@ z`F|xSbp2oUzvq8QgTvofjSZOD)fAjvzcVpl&6POwa1$%2YbL<e1kLswacV3d&dzRV zXlOPxFfdT${PpeS#e)Y9*x1<U@P7I8=+KreTg1e~1UdfyVPgF9{Moa#w6q{&zCXVn zY@Rl4T5~<<{4*v4#vhDl;T^B{OhQaNU~wKM1EvtB1Skw;a$qt5<ygiuj5`>QgU8aI zFg{`2&$tJiaUU?A29>iQ3|^Z7x(?WZ(T*{naUJ6WC|u1L#;Cz?gW(3_5yn%Dw;5l! zK?{|4jBgkpFuE{VsPQ&4@tVXqg6;%iiUHli3^@X02E!D_919Od7f|&Jp2cTjs9{*Z z(8U6}KcGH?VFp77cye$B!y$%s;I#uC3>^#$8P+k(VPs)Ez|g`l6MS)I1LzD7h6aXC zhA9j)zy%R#9TF?UE~t0|!)`_{Mh(UT4Gv5RjSX1JAQ_=XZLDPt1NM@sg;hvK;KPI0 zP24YDyf}X3gMfmujg3vS_=5)zj-C1Q1yoj9$jHd(Dt!5K<u)kyirqVWQ-HzBO-DyZ zLPEkS*qTA$&Qs8uLJr(zm?pFg!&*pz3bw~zF$y+5P{DR($Bu@Eh9$3L%re~>)`5yj zaBp!F!zPAl9Pwr{U-vCoumDnqDmJ`%^X8YZiji|nR#ujmmzS%xk%}y6`NxhOJ5D^| zQZNc|W@v;In>=-Ob;a?{Mhe`oZrr%h+`_;JEg(T<<q~jra)bRJP@D409|l%_F%gk} z|Nj2|_3zK$|NsB6eEIVJ!}mXbn0dIkzJ2@r``@2GJS_iSym<EF{r5lrn0bYGcz*o& z@{_^--><Jf|NmoRVrFAy0*yAZut-Tsi*T_p`~+Qn`R5;~hrsan$G0CpKED3&frW*W z?az-NpWeQG_l}8)jfLS~gAfY`^Y1@@goH$edD)m4e!hMA?p<@U5F_Z$8CGyn4k8%- z{QlR%$IQaO1Qlau`SYb!hzTUZ!46UZnn`40`1h|>fRO>Q$%B!J;m_Y@Mkb~ffq(zl zxS%Tk{{^cQW@2GxU}9l`XlMNYpNZku@3sc41$iU(GF$NPU-aU=m6el+<<IBuP27L} z{Q3Ox4+{_Ibe3ij(6!h982<c&T-eOQ3>qu>+baAQR6nqS?%M&KImXGx!1DiJTQj({ zX9TtNI>Ag>!H-%gbU^C|hW}lR|Nk{IfQ|@iWc>fXmFfTge~pZcjIE%pX&@2ED6T96 zBZDdf0|RI!z5w*TMdnL?{#<eX9{`@t3}^tIBfx$~=$+D%B{4D0?hISNnQ{xG2BQt5 z4WmYb1LKEA<{JwVG(ZbVXMk2wHG@uouVL83@P?6x;mrS>|2oax?4SO9VR`WabfXjt z2M0?#`=1X291;>QUNl4RzUX9NWawmIV2Ed6VgRk&2HjGV%kY8GgwcfI17i*Y=vK2F z#u(6U4MqV*HAV}D0}MYHc^E?&-5A{%?lIhB_`s;c7{PFY0esgoqa33YqX;7hqdFsK zdWr$s=y77?U=(3E4LU%unfcKpJ-t>Y78agHRvs1>hBIfH7=3&i*+2Y#^ytx}yB`|a zKM3pT>FNFX(46~s$=^SJ|NLF@cfsE$f1mta@b}L@hkphCZ2sB&v-nr@&*h)PKc0UA z{{;T!{LA_0^H1lW%)gX>HUCupsr*y^=kd?vpUXf0f5HDk{)K?e`TbAepUXd!e}Vt1 z|J5`zb8tL((8~1V$D2mhH$Q$bT)5E0_~1b!yNoKR-^DJ|$S(8d!Gi}6Zpk#~f(mL- z&jofd377^QV|fP5Is;w=IR&h03RvU^!w>K|EK3;ngGE8NlpO+Hmdr2(v5t%32*XZ> zCCwXkK(~*95<h4|Cj-+T(17l*UrbC);M;ru{Q39q_jd-+p)w$c{coAWz}(F6w}XMP zg_(ur#}Dw1mOo95KYlcU`um`x@<2!3vox}Uck=xB&C<NFft5jmp_+k_p$&S9y(a@R z1NhX+j0}Hp$^umeUl_hHG%-vB4PG<MVVKJ>gQ1_HjiHmNBsK<g=HNkwB@Aus#U2_O z8XE3}pv7ua7<MrnU`YrsNJ#<T8`I2u$H3rDv+|!mOg|WY{{r2O&L|=R+Q4KX!uaj! z!4)f3oO$x(`5%)vZ%mrALAPZ7Tk>xScqVMgza{@U{=ND4``;fh{P^$Nf1dv;|Fyw` z$5;N{`Oo^F=Re<nO>q7IosO;dU+6!_zpwx9{JR3aLqQ(2oDQ^@pqZKF#S4~Z1r81w z0fujXI5;>y-Fxuh+>IMIPF`aaGPJj_uy8dn;OF3JWZ-Ge2DjahFg#!s07V$10C)rl zbk*h+hG+0=<JcL#fxEw;n}9)4`+?yB_;}<43>z3A3v@PvCpK0wOkg+yUcP&zc{V7| zPtg9s#r1>X-#-Q>MplM@zkmG%T^7s4#3sPU$IkGN;osMHA3l8j^XDfE*PlOJ&7Ca& zelajJHGyx^WNBdrodwqfYEJ*@=#*n&VfY6+5b;0g7$s2H{$OC?;^yGs;O5`}ZBA!k zX`apW|KESeU7DcXOXkousoc;q2DGYHWrGv=ObG$T4{sd*yZrZHQIOdZ@c^`;t>AwJ zQ-BYH!~dj4rdbRH9ZWq8bsY{2cNke*oItCq7)2OmR2&&O82&Uca5yj=Vf<p^#K-}< zp_=K%2L=a5jz*>%3>qC^f^k8E6T=!%JA|>J!4XP>`=v<Y4h(0Sr!#$E5b9uh#~{)% zo#_t)M+cag4o<P|42%q33=9mC3``8l(DU{k{xdL6Y6o2)7XCl@e*$<7TGW5D|5_{u zE?wW#4qBaU@t^VEvwv?I9R3|_6g4sNjtcYf@d=CaHZif5|9s)Xh0pTV&AyB|3||<z z80{D%866pU7#=d5V|c>I%_zgLfnfn-ZG|htc19k?SjL%*QyI&^hZT#iSTTR~;Ttz@ z99}(t#fpP}^aBC{^#2@e7X9+&7bj@ePn`4DmoJPm`ZhK;2GUH;GetQ#cm?=*czF2* z_&7ND*nhu%@%kqlcXJODGYfMQ)4xA|L8tA1_zb#B8?@B#!*>SI4m~c$Z?Mz$L8lUG zLC;L&XJBRk?I31~h$!@6SjBK3bPO-!GsZiNQyDcF7B+J?$Vl`2`}XJ0`Ppp^&EDX7 zm}CE>{$BjM_3whe8Gl><F8=%R-}(jyfyM^TJ9l<0I?Tawa?7<AZ-xipq`Qq_CBrmu zYjHlqeuird51RYAKX7ocf$mcI`|ab0=KcnjA3r{Q_}a+y?d#8$e#n>y==?!YO$OQ@ z2y!7m0}DeV!#2172LBHKtNB;-AJmtxWL)>WnOmlzp>6j0KYzac<B@J|^kmq_SjTvZ z@dXnL;~B=ij7u298J0IQ+-c;vy6FT5$Kgdg?lgNd>;d(O8Ll!MV3-ef+BAlh4BHs? zH21Tzym|BX<IhIs|DdtWeuf{7Og}z<ZDjuX;q#AXsM|n$ep#XG17P<%FcdVmIQ(~M zZfR*@kZ5jUxYG<-8^FZC$iRfA7QB1_t_<Q|E(Jyg9t8#l(8@A)=&Cf(5e19^HjE)h zKrGN|k{OIQSezNofaj&pG`BN<<Kp_(+}^<W<3|g0#}rO;G9uvS1pLoIGv@~n&krKa zsX>@yLWDW$42%rgNGS~zkBku!o(wk`6B#El_A|CHS}<BOx-x1q9BJnMVqu}e`uxtF z8~0y-g(kJBe>eY4_?!N>;_r{YpZ`AoC-844D5-G^ELn2&yOxcOlewZmGiVb6Xl1GX zf2aS^pf=0@r2irRJ^nj1_jCW@;ACS2UC<1=JH4Nq<-><>3>-W>Je=$-&5+a3LAgN< z&5f@A75-iMck<t{f8YPtH!@6h`mg(+|G#82_nkY>Sye17zI=Us|3<SbV+rFICN?G> z#+?k;8=V<8GsZJcVr*#Uwz1Lresswa0RcsGr)F=ki=zKK{nrOoI{!i2ojv}C{7(Y8 z?#C|%HcpN|fB*dc-Q3U3!^6q&4b+Tg=j4I9&XR$V!HR)_0krB*l!2K6bXGrOMutBl zAEOGRETayiDWd_S1S1<`1Y;&+DPszw7o#R4A0u0{;JLVvkcfx~e=`L(mZv99oH%)` zIq*N|hE&ihb>IIc|33e_^l$gSj(;xyYX7bOclO_t|Dyku{;M<#+DPc=o0yo$e7NG{ z6$CmWC!jg-f53kO$RZ3dY4~65zrufw|0e%^pi4_4{zo)V75u`*!3A3T%*OQR-;d9q zK7aetJXMefblNTl2kXBdJUn~?0s{Oz(6xUIppw{^fq}skdUl}{D4#QbzHn}?&;Q*2 z4*zZb+x~a`AND`#zrer$|Gxd__^<Teg0=hPzV+vRH#6`#{I3&hZwF_nt{H3g+`9Ku z0CZR)pP&G5b0b5PBg1lr4a_A<8j0=<y$rJ$)-s%76kxc)u!5n7u_VfcVLHPph6N0Z z7}^;enz<!xYz#G2Ra8{WLP|kPW<|u<zI^%e@ynlotOCsu{|){J{P+Fu4L%1D)J%X} zq5--$DdNA^e`9dWs(>$!*Z8mTU+ceK^PC3pSFc~ac?H_h`2OQ3(BULZObq`)i>#XG z@Uwufs%GWj;NapH5@BIsY-0TPuZe-F8N8=~0kmQXwzdgg##l5n@H8_lX=Zo>y079* za|?q?a|@*W0I3I^I0IVY1XrH{Qt$9T1XTmL2E?VFqZzFJ1Cj+`^`MnYYZ(|AK=TQX z49pBJ3@i+SCr<x1Pf1A$wo()j5HPgk+_J^(f5m@S@YTw8|HJ>6iuF&JIC<{o6SqJ9 z{?EW9Y3?5o=qY*UPMhQZp#Skq4Gj&h|I_}vLGM_LWS)AIp{Eft#}@uSmS^fMCKVk$ z+pzpNeHIoch6N1s8Cp4W3lalejTA&VnVLA6I7JnVTmusea-A4j8Rj!A;AUabkIN4; z)6wR=HPz{V?EmopDb1V-sxLsd+h2S3t%=bPblD(dO^r801H%DO4-I@)-z9K6`vAiZ zhQ&g43HDMPEG#VVF74T~=a-FxgGr<}!(>n+o#6<>MTW<ay`K#48E%3$)iUg9bOLLh z$Q>ZY^ZVtqPh2u#@kWi1^;Y5kE7&(2I<#ronhRfA*uPv@vux9$LmQm`SNsnLWtv7V zqxdix*4NLz^N0n2HeMWPwpp`g$LaeoKC?+`S-W^fWtNnLgammxm?-jmdT?>mte&3k zS(`3C_{5`V;@}k&5>ir<73t|>sm%B7#r@Me)->;LuzB+2(c?GY{xC8!v2gHkGXMQ2 zA|k-U!^O_V%<%8u@87?E|M~lmftihyi-(&ZG$g>x#lykE%=Gu$o5zoyfD8~5<7fN# z=jZot-+%vO=V1Ev>(Qf!&)$9f^#0wu&p&^Gz|YU`-hKS~<=xYVj~@N{#mLG2@7MQl zKmYt=;}>gQ#`ym~^cG)X1x5yG1qKE==)Q1J$;HY7p0#BWm?G7+h-Hq<2N?#a5W@>+ zhAj*d3@r?E7%i?iFw9`Q!oU#W!m#AO3;4iV3C4<u<_1Sb0Y-sFN6>zP7Iq<?AOHTn z_#@QZz!(zJ$hc-r3#W?9lOsp2n1GH}YG6!AXk=Wl0GdNUtMp*CHf#-GBg37>mPQ5} z*djehUINvjuoJ0Sp{F;2YG6j0JB()-z^n^4j87OE9RBBk&i4BRB7VTmqt<0$WB{G* zC(ppdzyoa`JA#(cH88ozopb%q_CM`^*#B++zWwK7+H{P;;op@;h8>N}GIf_296=4} z4h9<sh6d&e362}Cj4|K^4h@V47-ulKNH91seraSdX=MJg<_Lo$s1MxX#_$0=XLX0+ z3!?<X6~-MqAm`<SR<&Jep2+cwiHS?%AH$U^9TOQinpi&kV6d_2m<aJFXeB!ACKFJb z1GJi*X$@$$I~jD3Ne9E41_!1MpwqsYSy;e3y+Id#!_F`S?ULn1YO!!Kz<0@J{QvPk zfyqS&vP+gJho^$6X9t7x{{rwT#e(K`W;Q-Pw&r%$FCRX9VffPsZM#%3FftTD&&$w+ z-b%u@Y11iY9UUD=ev0{@CfK!U(@oGJ%p4p{f6kqG^nAkv_y5uV4gPEY2hClAa4h2t z28aJKjUdeQ`^}w3raSwa9sWmy_o_uRHSfRU#_)yVD#Jc7T*)w_frXESg~h^&p^f1N z!w;rAuYa|$1q3MG*}h{3WW&{ZhIZk|fB<JnP!H+qjvKrdD!$$hp7pK_d%@i|(Cp<w z###mk(4`BYdk?-pyV1ya!wqy*+l~e&(10q#5=OThZvSom+k<lc|Cs+7|4SMec$(OF zd0*|h@$7qx>YASJdB<NA6}`B)eQnR0wc9VgFmnkA2=MdC$uBJ_$&7F`dvSbTPxDIF zM?b)~xXb?e_Uhq}M-N|p`=g>DBO@az#=ykD#KbAApz`P6pP$VuS!Ea)|Ns5dDD#I~ zLYhHFT7vt}lP51;ym<A7f$2X3BQxXQZ-4&&Z&?XR4WM-s1q=)fdeFODO+fn+{(brP zh4I7*$Nx<Kbyz0td3de`)YLNiuLloo@Bh*NJwc=QTpM{n+Z^t%nzCWB!~cW^&_zKE zR?W_gGK|L<lNk2#xUsOX$T^3_6l8fSi8=hQV%f&+77+zH&0{&VuX~eGu-OqjG{nLZ z$nb$tf#C+jeQ+y%J;MfuZ43t?OFJ1(Fq~mH$*_%K0Y{1x!<8#nuCRoFR<zDwILXM= z0Gc#zarmFXeC6<&=S>`}Ts$oQo}NE(#et!REy_}bh37`2GjxWckfEiS!Nc*t)qg92 zq9Q3SCGWJ-va$$OmS4Bm_JXzvW%2Y(S%2#ni==HxNQkp$^D+jGW)>|c6KU>7vHu+W ze0+SooNO#_zB2Lf@rg)ENJuDXHuo_62b~5#SqU`o!u00PuV4R}L1R`dENskwfBg~T z=jCQ$`Tg$MvuAHVH1{$vHiCw0!N;*PLeGu@o$mxX(H=C42kT)oRJk!+VR*wZf#DOw zHHJEdY0d0>TOQbm**)6T?Ede|zX$(z{5$h+%fAQzzWh7Wz~Ioxu4D7ziO!2J7R~Mq za~QTT@-Td1n8Waek%wVRb9V#VyB{1396vrZce8VF{Q1N2hk*k&atAB@KrIPSISF3< z%*e>(2<p>A&f{lPVRUG0Z3Ufp1G}97RJy|2D<EBvwb*OGYoL1?!40$)NRKE3x<1E* zfr$ZhPq+>P3usX_=q%j}XAbP2-_Xzy5)vYL;EdD%GEhsC^}vCamTzj#|E>N<{D1d9 zin*yz#m(`5*#9tQEiHzw#zu}M6G7`jW=>zy$g$*sgM)*^{Ur>JpuwgF2AM|om>33? zm>7m5jSNSc9T*<4zIpRnB_hX#p_gGV!*$RY8taP}&rLy_2bVJ3XLtZgV$3WoDICs> z91Ld|G8pbL=cF*4a0Cs$Fn#y{K0&6D!$KK!KZJ~yMI)odc4yFl69}`Nv|!k<fkC2? zZOs}6i8X6rrBJhEL&K80pzVJ@PAzF@SaKS4=EmtIpsleV92uGz8W<lu0Nso60ZcKo zG&Ha@uTo=T`tteRr%&(Sefq-0^o4<!i;MT)7luzxTnyj-2?+cF4dVS`V)_NTs~I%! z-ps(#%<#9F;on5i<{eh%MnxuOHc;Gte*Wai^KTq~-n{w4@axZ;H_sT}y!rLy&z~m@ zKN?p-@_rWsBLnF6Qc&y8iGi8H6rA@D{5!z9Vns`ffq}!nM@-wcZFBoy^}p<Y*8hzE z;7bOW|NZ-S*yDfJ|FZuIp!=Y}r$_4j*JE68!S&yh|4jd9{Ac;E^WTE;+y_U{+7zZM zR~Q`r-D+fB;^45Pl^qgo6A8x}^MeOx&VaT^ePG<O#euPa349397KRrLe;D;ZwIE{# zQ$<BZIKxqfKMXGzO&JRq3qT7YLE~-=Ul>4>-Z2b681oqZFnnQ{zz_jCBndP&+2FwN zq>)*or$?fd9TK6+M8+pG&x;p4pbb`_YPLb5p<&5wQ0(3YMeZq3<etJGxf_{Z{NVZ1 ztorZYhmWt`y?goo!@qwY{&KRhasK)6=batfpHIJdcz*oj;raLN-@k9o4U8Nd?V#xW zgNS5imN#!$Kqhc;u`)5Sa&i6p$Mx;yvu7`Va{YVv?jO^ifA8MCV0!oN&$EC3o;7zd z{BH(Lpo81;jtq<pP7DkTq6|z7upTADB!_?37+0L|{xA0b-G8h9oBlKWmjU;6Ko`() z{O4f0af87DbW|FnTO*jw=*E8I2E(3+h&>+~89p?7Gkjs}VVJ^@z$n7d!l=Q>z_^C7 z2E2*V!^0WeX8ywP1-#+c;lD^DlZy+3!+#NW7Z(PJGiM}v8X0<;1$7!4Dk>UuDk>UY z969phK|{lX=Ba`<Y)rp?vDy6k#q@=b53~vYPxDlU8;#sNJPbE@co<l|d|`Rh$nXZ% zpY&5;WbjjfoVg_iJy!~H<`%f!2|7ZP5p;wmQ_z2@e`)`o{4@IJ_y56vlm9vY0{*@G z=k)K^zhD16{+;<J@Ndz-s(&vU92j$2nD#_`Xm()CX<*tD0X@MB-89BLCLzWTObeKD z{$F7f_<x4+2;(irUyLn`0Zc56Z<tybEtpm?{%LUdccFzz;!01m!@mm+OcG}p7#mE$ zJM+PVnGFmLoDGMbJv-EJ?;dDyvw@+3)dVciJeQHlp^c62+c!RjfB%|UomfE3=D7_F z=i1nQv9SDNc=xWE^&G<w7M35)bHT9;+7%CK#j-LmF@RdJpc1)($&cYlV=Jf$>-ax} zVMZhP2A2i~CeRHqcyvvH>jEtvY6NQl6RqHt3Jf5-Kzk}t?fStmp|Q1rQH#NW;REz; rng)hnAgdsy4ygSJav`Xufx8fNi5y5D*o_Q-Kss9+82*5DF)#oC7E|<2 literal 0 HcmV?d00001 diff --git a/react-ui/dist/index.html b/react-ui/dist/index.html new file mode 100644 index 000000000..caad9f594 --- /dev/null +++ b/react-ui/dist/index.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <link rel="icon" href="favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta name="theme-color" content="#000000" /> + <meta + name="description" + content="Web site created using create-react-app" + /> + <link rel="apple-touch-icon" href="logo.png" /> + <link rel="manifest" href="manifest.json" /> + <title>goSDN</title> + <script type="module" crossorigin src="/assets/index-CjxHZxKK.js"></script> + <link rel="stylesheet" crossorigin href="/assets/index-CS1-FuBh.css"> + </head> + <body> + <noscript>You need to enable JavaScript to run this app.</noscript> + <div id="root"></div> + </body> +</html> diff --git a/react-ui/dist/logo.png b/react-ui/dist/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4ee061e519860d12b8fb8bb044b1df4359f20d GIT binary patch literal 66912 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 literal 0 HcmV?d00001 diff --git a/react-ui/dist/logo.svg b/react-ui/dist/logo.svg new file mode 100644 index 000000000..b7f71bd90 --- /dev/null +++ b/react-ui/dist/logo.svg @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with Vectornator (http://vectornator.io/) --> +<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 113.4 212.625" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:vectornator="http://vectornator.io" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> +<radialGradient cx="170.235" cy="146.046" gradientTransform="matrix(1.00001 -8.65109e-05 8.65119e-05 1 -115.465 -116.986)" gradientUnits="userSpaceOnUse" id="RadialGradient" r="217.591"> +<stop offset="0" stop-color="#c456f7"/> +<stop offset="1" stop-color="#34054a"/> +</radialGradient> +<filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="209.692" id="Filter" width="111.957" x="0.722269" y="2.46642"> +<feDropShadow dx="-4.37114e-08" dy="1" flood-color="#050505" flood-opacity="1" in="SourceGraphic" result="Shadow" stdDeviation="1"/> +</filter> +</defs> +<g id="Layer-1" vectornator:layerName="Layer 1"> +<path d="M35.1413 3.47016L35.1416 6.93891L27.1415 6.93961L27.1464 63.3771C21.6096 65.0011 16.4869 67.0445 12.2717 69.6596C-9.35807 83.0789 12.5182 123.232 12.5264 123.222C12.5341 123.213 12.5498 123.2 12.5576 123.191C13.1518 124.609 14.5144 125.761 16.5579 126.534C18.7737 127.372 21.8204 127.855 26.8082 128.408C25.0644 132.318 24.4639 137.732 25.3409 144.846C26.0816 150.854 28.2327 155.309 32.5924 161.533C32.9615 162.06 34.1761 163.796 34.3427 164.033C35.013 164.984 35.5416 165.705 35.9991 166.408C38.1084 169.647 39.1319 172.149 39.3124 174.814C39.3701 175.665 39.3355 180.513 39.251 187.751C39.2362 189.024 39.0999 200.614 39.0959 200.907C37.7122 201.653 36.7523 203.069 36.7525 204.751C36.7527 207.19 38.7205 209.157 41.1591 209.157C43.5978 209.157 45.5653 207.189 45.5651 204.751C45.5649 203.019 44.5477 201.568 43.096 200.844C43.1023 200.341 43.2363 189.045 43.2511 187.782C43.3388 180.268 43.3816 175.583 43.3124 174.563C43.0775 171.096 41.7912 168.012 39.3427 164.251C38.854 163.5 38.3197 162.708 37.6237 161.72C37.4507 161.474 36.2342 159.766 35.8735 159.251C31.8564 153.517 29.9529 149.563 29.3096 144.346C28.2621 135.848 29.4895 130.5 32.027 127.533C32.6413 126.815 33.2789 126.306 33.9019 125.97C34.2334 125.792 34.4442 125.7 34.4956 125.689C35.5735 125.448 36.2365 124.392 35.9954 123.314C35.7543 122.236 34.6982 121.542 33.6202 121.783C33.2264 121.871 32.6655 122.078 31.9953 122.439C31.0669 122.939 30.1635 123.734 29.3079 124.658C23.0392 124.019 20.0922 123.577 17.9951 122.784C16.1482 122.086 15.9773 121.63 16.7137 120.347C25.511 115.923 43.9287 113.157 55.0885 113.156C63.8081 113.155 79.7952 116.873 90.4333 119.622C93.9977 120.542 94.7294 120.755 96.621 121.277C94.2649 123.034 89.4439 124.738 83.3087 125.247C83.0835 125.266 82.9434 125.443 82.7462 125.529C82.6074 125.348 82.5171 125.106 82.3711 124.935C81.4271 123.831 80.3863 122.999 79.3396 122.435C78.6693 122.074 78.1085 121.867 77.7145 121.779C76.6365 121.538 75.5805 122.233 75.3396 123.31C75.0987 124.388 75.7619 125.444 76.8399 125.685C76.8913 125.697 77.1021 125.788 77.4337 125.967C78.0567 126.302 78.6942 126.81 79.3088 127.529C81.8468 130.496 83.0751 135.844 82.029 144.341C81.3867 149.559 79.4839 153.513 75.4678 159.248C75.1071 159.763 73.8909 161.471 73.7179 161.717C73.0221 162.705 72.488 163.498 71.9994 164.248C69.5516 168.009 68.2658 171.094 68.0315 174.561C67.9625 175.581 68.0061 180.266 68.0951 187.78C68.1102 189.055 68.2793 200.673 68.2838 200.967C66.9421 201.725 66.0027 203.098 66.0028 204.749C66.0031 207.187 67.9709 209.155 70.4095 209.155C72.8481 209.154 74.8156 207.187 74.8154 204.748C74.8153 202.975 73.7598 201.482 72.2526 200.779C72.2461 200.277 72.1101 189.009 72.0952 187.748C72.0095 180.511 71.974 175.662 72.0316 174.811C72.2116 172.146 73.2659 169.644 75.3746 166.404C75.8321 165.701 76.3292 164.981 76.9994 164.029C77.1659 163.793 78.3803 162.056 78.7492 161.529C83.1079 155.305 85.2582 150.849 85.9979 144.841C86.8306 138.077 86.2654 132.917 84.7153 129.06C93.073 128.178 99.944 125.471 101.777 121.527C105.258 116.592 120.674 81.4184 100.46 69.1833C96.4145 66.7344 91.6503 64.7196 86.3971 63.1845L86.3922 6.93448L78.3609 6.93517L78.3606 3.46642L35.1413 3.47016ZM31.1419 10.9393L39.1107 10.9386L39.3309 27.9386C39.3406 28.6841 39.9605 29.2606 40.7061 29.2509C41.4516 29.2413 42.0593 28.6214 42.0497 27.8758L41.7983 10.9383L44.517 10.9381L44.7998 27.9381C44.8108 28.6836 45.3981 29.2615 46.1436 29.2505C46.8892 29.2394 47.4983 28.6209 47.4873 27.8753L47.2358 10.9379L49.9546 10.9376L50.2061 27.9376C50.2169 28.6831 50.8357 29.2608 51.5812 29.25C52.3267 29.2392 52.9044 28.6203 52.8936 27.8749L52.6421 10.9374L55.3609 10.9372L55.6124 27.9371C55.623 28.6827 56.242 29.2601 56.9875 29.2495C57.733 29.2389 58.3418 28.6199 58.3312 27.8744L58.0797 10.9369L60.8297 10.9367L61.05 27.9367C61.0546 28.3094 61.2147 28.6381 61.4563 28.8741C61.6979 29.1102 62.0211 29.2537 62.3938 29.2491C63.1394 29.2398 63.7468 28.6194 63.7375 27.8739L63.5173 10.9365L66.2986 10.9362L66.4875 27.905C66.4957 28.6505 67.1171 29.2568 67.8627 29.2486C68.6082 29.2404 69.1834 28.6503 69.1751 27.9047L68.9861 10.936L71.7674 10.9357L71.9564 27.9357C71.9605 28.3085 72.1132 28.6372 72.3627 28.8732C72.6122 29.1091 72.9587 29.2523 73.3315 29.2481C74.077 29.2398 74.6833 28.6498 74.6751 27.9042L74.4862 10.9355L82.3925 10.9348L82.3969 62.2473C78.1953 61.2363 73.8195 60.4151 69.2716 59.936L69.0841 59.936L69.0846 65.9672L62.3352 73.3116L62.211 82.5928L62.212 94.7803L56.5244 94.7808L50.3056 94.7814L50.2733 82.9376L50.1163 73.3126L43.1468 65.8132L43.1463 60.0945L31.1463 62.3455L31.1419 10.9393ZM46.0197 41.188L45.9904 64.3755L52.9599 71.8749L53.1492 91.9374L59.368 91.9368L59.5225 71.8743L66.2407 64.5612L66.2387 41.3425L46.0197 41.188ZM45.5578 121.282C45.0484 121.232 44.5158 121.369 44.0891 121.719C43.2356 122.421 43.1382 123.71 43.8394 124.563C43.8712 124.602 43.9181 124.67 44.0269 124.813C44.2163 125.062 44.4521 125.354 44.6832 125.688C45.3494 126.65 45.998 127.755 46.621 128.938C48.9603 133.379 50.0248 137.836 49.1222 141.875C48.4351 144.95 46.6061 147.711 43.4353 150.126C43.1568 150.338 42.1644 150.942 40.7792 151.751C40.6905 151.803 37.4839 153.662 37.4356 153.689C36.4728 154.23 36.1131 155.445 36.6545 156.408C37.1959 157.37 38.4106 157.699 39.3734 157.157C39.4251 157.128 42.7199 155.272 42.8108 155.22C44.3781 154.304 45.4057 153.669 45.8731 153.313C49.7829 150.336 52.1324 146.76 53.0285 142.75C54.1746 137.622 52.9238 132.266 50.1834 127.063C49.4811 125.729 48.7181 124.526 47.9643 123.438C47.5056 122.775 47.1244 122.271 46.9017 122C46.5511 121.574 46.0673 121.332 45.5578 121.282ZM65.7769 121.28C65.2675 121.33 64.7837 121.572 64.4331 121.999C64.2105 122.27 63.8293 122.774 63.3708 123.436C62.6172 124.525 61.8858 125.728 61.1835 127.062C58.444 132.265 57.163 137.621 58.3099 142.749C59.2067 146.759 61.5569 150.335 65.4671 153.311C65.9346 153.667 66.9935 154.302 68.5611 155.217C68.6519 155.27 71.9158 157.125 71.9675 157.154C72.9304 157.696 74.145 157.367 74.6862 156.404C75.2275 155.441 74.8676 154.227 73.9048 153.686C73.8565 153.658 70.6495 151.8 70.5608 151.748C69.1754 150.939 68.1829 150.336 67.9044 150.124C64.7332 147.71 62.9036 144.948 62.2161 141.874C61.3128 137.835 62.3766 133.378 64.715 128.936C65.3378 127.753 65.9862 126.649 66.6522 125.686C66.8833 125.352 67.1191 125.06 67.3084 124.811C67.4172 124.668 67.4953 124.6 67.5272 124.561C68.2282 123.708 68.0992 122.418 67.2457 121.717C66.8189 121.367 66.2862 121.23 65.7769 121.28ZM28.3735 160.064C27.8641 160.114 27.3492 160.357 26.9985 160.783C24.0604 164.358 22.5881 168.723 22.5621 174.253C22.5614 174.404 22.6311 200.839 22.627 200.877C21.1966 201.608 20.1896 203.036 20.1898 204.753C20.19 207.191 22.1578 209.159 24.5964 209.159C27.0351 209.158 29.0026 207.191 29.0024 204.752C29.0022 203.061 28.0235 201.65 26.627 200.908C26.6562 200.425 26.6538 197.055 26.6259 187.658C26.6229 186.662 26.5615 174.385 26.5622 174.252C26.584 169.618 27.7563 166.157 30.0925 163.314C30.7939 162.461 30.6644 161.203 29.811 160.502C29.3844 160.151 28.8829 160.015 28.3735 160.064ZM82.9679 160.06C82.4585 160.01 81.9571 160.147 81.5304 160.497C80.6772 161.199 80.5479 162.457 81.2494 163.31C83.5862 166.152 84.7591 169.613 84.7817 174.247C84.7823 174.378 84.7241 199.67 84.7527 200.841C83.3011 201.564 82.2529 203.015 82.253 204.747C82.2533 207.186 84.2524 209.153 86.691 209.153C89.1295 209.153 91.0971 207.185 91.0969 204.747C91.0967 203.049 90.1265 201.611 88.7215 200.872C88.7173 200.833 88.7318 194.753 88.7516 187.684C88.7544 186.688 88.7824 174.398 88.7817 174.247C88.7548 168.717 87.2817 164.353 84.343 160.778C83.9922 160.352 83.4774 160.109 82.9679 160.06Z" fill="url(#RadialGradient)" fill-rule="nonzero" filter="url(#Filter)" stroke="none" vectornator:shadowAngle="1.5708" vectornator:shadowColor="#050505" vectornator:shadowOffset="1" vectornator:shadowOpacity="1" vectornator:shadowRadius="2"/> +</g> +</svg> diff --git a/react-ui/dist/manifest.json b/react-ui/dist/manifest.json new file mode 100644 index 000000000..641e73d58 --- /dev/null +++ b/react-ui/dist/manifest.json @@ -0,0 +1,20 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo.png", + "type": "image/png", + "sizes": "400x400" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/react-ui/dist/robots.txt b/react-ui/dist/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/react-ui/dist/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/react-ui/docker/wasm/Dockerfile b/react-ui/docker/wasm/Dockerfile new file mode 100644 index 000000000..343521154 --- /dev/null +++ b/react-ui/docker/wasm/Dockerfile @@ -0,0 +1,13 @@ +FROM golang:alpine3.20 + +WORKDIR /app + +ARG USER +ARG GROUP + +RUN mkdir /.cache && chmod -R 777 /.cache + +COPY ./docker/wasm/entrypoint.sh / + + +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/react-ui/docker/wasm/entrypoint.sh b/react-ui/docker/wasm/entrypoint.sh new file mode 100755 index 000000000..934d25928 --- /dev/null +++ b/react-ui/docker/wasm/entrypoint.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env sh + +#go mod download && go mod verify +#ls -al $(go env GOROOT)/lib/ + +GOOS=js GOARCH=wasm "$@" + +cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" ./build/wasm +cp "./src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated" ./build/wasm/wasm_exec.d.ts diff --git a/react-ui/docs/README.md b/react-ui/docs/README.md index df992548a..ae2f7de6d 100644 --- a/react-ui/docs/README.md +++ b/react-ui/docs/README.md @@ -15,7 +15,5 @@ yarn start ``` The ui is now accessible by `localhost:3000` - - ## Development notes The ui can run independently from goSDN. But to actually get in touch with the ui, log in and start working with it you need a running goSDN instance on your local maschine. \ No newline at end of file diff --git a/react-ui/eslint.config.js b/react-ui/eslint.config.js new file mode 100644 index 000000000..fd9f6d879 --- /dev/null +++ b/react-ui/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import globals from 'globals' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + } +) diff --git a/react-ui/package.json b/react-ui/package.json index 056db6412..439250704 100644 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -2,15 +2,13 @@ "name": "react-ui", "version": "0.1.0", "private": true, + "type": "module", "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.6.0", "@fortawesome/free-regular-svg-icons": "^6.6.0", "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/react-fontawesome": "^0.2.2", "@reduxjs/toolkit": "^2.2.4", - "@testing-library/jest-dom": "^6.4.8", - "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.5.2", "bootstrap": "^5.3.3", "i18next": "^23.11.5", "jwt-decode": "^4.0.0", @@ -18,6 +16,7 @@ "react-bootstrap": "^2.10.2", "react-dom": "^18.3.1", "react-i18next": "^15.0.0", + "react-json-view": "^1.21.3", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", "react-scripts": "5.0.1", @@ -25,17 +24,18 @@ "redux": "^5.0.1", "redux-observable": "^3.0.0-rc.2", "redux-persist": "^6.0.0", - "web-vitals": "^4.2.2", - "yang-js": "^0.24.70" + "web-vitals": "^4.2.2" }, "scripts": { "start": "vite", "build": "tsc && vite build", "test": "react-scripts test", - "build::api_old": "./scripts/build-api.sh", "build::api": "npx @rtk-query/codegen-openapi ./scripts/openapi-config.json", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "lint::fix": "eslint src --ext .js,.jsx,.ts,.tsx --fix" + "build::wasm": "./scripts/build-wasm.sh", + "build::cpp": "./scripts/build-cpp.sh", + "lint": "eslint src", + "lint::fix": "eslint src --fix", + "clean": "./scripts/clean.sh" }, "eslintConfig": { "extends": [ @@ -59,23 +59,31 @@ "devDependencies": { "@babel/runtime": "^7.21.5", "@rtk-query/codegen-openapi": "^1.2.0", + "@testing-library/jest-dom": "^6.4.8", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^8.0.1", "@typescript-eslint/parser": "^8.0.1", "@vitejs/plugin-react": "^4.2.1", - "eslint": "^9.8.0", + "eslint": "^9.9.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", "prettier": "^3.3.3", "sass": "1.77.6", - "typescript": "^5.2.2", - "vite": "^5.2.0" + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.1", + "vite": "^5.4.9", + "vite-bundle-visualizer": "^1.2.1", + "vite-plugin-top-level-await": "^1.4.4", + "vite-plugin-wasm": "^3.3.0" } } diff --git a/react-ui/scripts/build-api.sh b/react-ui/scripts/build-api.sh deleted file mode 100755 index 710affc43..000000000 --- a/react-ui/scripts/build-api.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh - -PROJECT_NAME=react-ui -PROJECT_ROOT=$(git rev-parse --show-toplevel) -API_PATH=/api/openapiv2 - -OUTPUT=${PROJECT_NAME}/src/api - -docker run -i --rm \ - -v ${PROJECT_ROOT}:/local openapitools/openapi-generator-cli generate -i /local${API_PATH}/gosdn_northbound.swagger.json -g typescript-redux-query -o /local/${OUTPUT} \ No newline at end of file diff --git a/react-ui/scripts/build-wasm.sh b/react-ui/scripts/build-wasm.sh new file mode 100755 index 000000000..3b4ab1ab5 --- /dev/null +++ b/react-ui/scripts/build-wasm.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env sh + +GO_FILE=src/shared/utils/yang_parser/go +YANG_MODEL_PATH=$GO_FILE/openconfig + +OUTPUT_PATH=/build/wasm + +if [ ! -d $OUTPUT_PATH ]; then + mkdir -p $(pwd)/$OUTPUT_PATH +fi + +if [ ! -d $YANG_MODEL_PATH ]; then + mkdir $YANG_MODEL_PATH +fi + +rm $YANG_MODEL_PATH/yang_models.go +ln $(pwd)/../models/generated/openconfig/yang.go $YANG_MODEL_PATH/yang_models.go +echo 'Succesfully linked yang model' + +DOCKER_TAG=gosdn_react_ui_wasm +docker build \ + --no-cache \ + -t $DOCKER_TAG \ + -f ./docker/wasm/Dockerfile \ + --build-arg USER=$(id -u) \ + --build-arg GROUP=$(id -g) \ + . +DOCKER_PATH=/app +OUTPUT_FILE=$DOCKER_PATH$OUTPUT_PATH/ + +docker run \ + --rm \ + -v $(pwd):$DOCKER_PATH \ + -u $(id -u):$(id -g) \ + -w $DOCKER_PATH \ + $DOCKER_TAG \ + go build -C $GO_FILE -ldflags="-s -w" -o $OUTPUT_FILE/yang_parser.wasm + diff --git a/react-ui/scripts/clean.sh b/react-ui/scripts/clean.sh new file mode 100755 index 000000000..4220321a8 --- /dev/null +++ b/react-ui/scripts/clean.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env sh + +docker rmi react-ui-cpp-build + +rm -rf ./build \ No newline at end of file diff --git a/react-ui/src/components/devices/routines/device.routine.ts b/react-ui/src/components/devices/routines/device.routine.ts index 4eb1b6b18..10caffa2f 100644 --- a/react-ui/src/components/devices/routines/device.routine.ts +++ b/react-ui/src/components/devices/routines/device.routine.ts @@ -1,45 +1,46 @@ -import { NetworkElementServiceGetAllFlattenedApiArg, api } from "@api/api"; -import { setDevices } from "@component/devices/reducer/device.reducer"; -import { createAsyncThunk } from "@reduxjs/toolkit"; -import { setUser } from "@shared/reducer/user.reducer"; -import { RootState } from "src/stores"; -import { startListening } from "../../../stores/middleware/listener.middleware"; +import { NetworkElementServiceGetAllFlattenedApiArg, api } from '@api/api' +import { setDevices } from '@component/devices/reducer/device.reducer' +import { createAsyncThunk } from '@reduxjs/toolkit' +import { setUser } from '@shared/reducer/user.reducer' +import { RootState } from 'src/stores' +import { startListening } from '../../../stores/middleware/listener.middleware' export const FETCH_DEVICE_ACTION = 'subscription/device/fetchDevices' // continously fetch devices -const FETCH_DEVICES_INTERVAL = 15000; // in ms +const FETCH_DEVICES_INTERVAL = 15000 // in ms startListening({ actionCreator: setUser, effect: async (_, listenerApi) => { - listenerApi.dispatch(fetchDevicesThunk()); + listenerApi.dispatch(fetchDevicesThunk()) }, }) - export const fetchDevicesThunk = createAsyncThunk(FETCH_DEVICE_ACTION, (_, thunkApi) => { - const { user } = thunkApi.getState() as RootState; + const { user } = thunkApi.getState() as RootState const payload: NetworkElementServiceGetAllFlattenedApiArg = { pid: Object.keys(user?.user.roles)[0], timestamp: new Date().getTime().toString(), } - const subscription = thunkApi.dispatch(api.endpoints.networkElementServiceGetAllFlattened.initiate(payload, { - subscriptionOptions: { - pollingInterval: FETCH_DEVICES_INTERVAL, - skipPollingIfUnfocused: true, - } - })); - - return subscription; -}); + const subscription = thunkApi.dispatch( + api.endpoints.networkElementServiceGetAllFlattened.initiate(payload, { + subscriptionOptions: { + pollingInterval: FETCH_DEVICES_INTERVAL, + skipPollingIfUnfocused: true, + }, + }) + ) + return subscription +}) // save fetched devices startListening({ - predicate: (action) => api.endpoints.networkElementServiceGetAllFlattened.matchFulfilled(action), + predicate: (action) => + api.endpoints.networkElementServiceGetAllFlattened.matchFulfilled(action), effect: async (action, listenerApi) => { - listenerApi.dispatch(setDevices(action.payload.mne)); + listenerApi.dispatch(setDevices(action.payload.mne)) }, -}) \ No newline at end of file +}) diff --git a/react-ui/src/components/devices/view/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx index cc096b147..95796741a 100644 --- a/react-ui/src/components/devices/view/device.view.tabs.tsx +++ b/react-ui/src/components/devices/view/device.view.tabs.tsx @@ -1,4 +1,6 @@ import { useAppSelector } from "@hooks"; +import ReactJson from 'react-json-view'; +import { useDeviceTabsViewModel } from "../view_model/device.tabs.viewmodel"; export enum DeviceViewTabValues { METADATA = 'metadata', @@ -7,7 +9,7 @@ export enum DeviceViewTabValues { export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { const { selectedDevice } = useAppSelector(state => state.device); - + const { yang } = useDeviceTabsViewModel(); const metadataTab = () => { return ( @@ -19,8 +21,12 @@ export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { const yangModelTab = () => { return ( - <div>asdf</div> - ) + <> + {yang.current && + <ReactJson src={yang.current} name={false} collapsed={false} quotesOnKeys={false} /> + } + </> + ); } const renderLoading = () => { diff --git a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts new file mode 100644 index 000000000..f9d3124ea --- /dev/null +++ b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts @@ -0,0 +1,30 @@ +import { useAppSelector } from '@hooks' +import { useYangParser } from '@utils/yang_parser/yang_parser' +import { useEffect, useRef } from 'react' + +export enum DeviceViewTabValues { + METADATA = 'metadata', + YANGMODEL = 'yang_model', +} + +export const useDeviceTabsViewModel = () => { + const { selectedDevice } = useAppSelector((state) => state.device) + const { parse } = useYangParser() + const yang = useRef<JSON | null>() + + useEffect(() => { + const serializedYang = selectedDevice?.mne?.model + + if (!serializedYang) { + return + } + + parse(serializedYang).then((json) => { + yang.current = json + }) + }, [selectedDevice, parse]) + + return { + yang, + } +} diff --git a/react-ui/src/components/login/viewmodel/login.viewmodel.ts b/react-ui/src/components/login/viewmodel/login.viewmodel.ts index 370834a0c..60c39b55a 100644 --- a/react-ui/src/components/login/viewmodel/login.viewmodel.ts +++ b/react-ui/src/components/login/viewmodel/login.viewmodel.ts @@ -17,7 +17,7 @@ export default function useLoginViewModel() { const handleErrorMessageRendering = (formInvalidError: JSX.Element, backendResponseError: JSX.Element): JSX.Element | null => { // backend response check - if (!!loginError) { + if (loginError) { return backendResponseError; } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index dddcf5c07..384f33d82 100644 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,16 +1,15 @@ +import i18next from 'i18next' import React from 'react' import ReactDOM from 'react-dom/client' +import { I18nextProvider } from 'react-i18next' +import { Provider } from 'react-redux' import { RouterProvider } from 'react-router-dom' -import './index.scss' - -import i18next from 'i18next' -import { I18nextProvider } from 'react-i18next' -import { Provider } from 'react-redux' import { ToastContainer } from 'react-toastify' import { PersistGate } from 'redux-persist/integration/react' import './i18n/config' +import './index.scss' import { router } from './routes' import './shared/icons/icons' import { persistor, store } from './stores' @@ -19,7 +18,7 @@ const installToastify = () => { return ( <ToastContainer /> ) -} +}; ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index b4008f0fd..4cbc4b6ac 100644 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,65 +1,63 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit'; -import { RoutineManager } from '@utils/routine.manager'; -import { REHYDRATE } from 'redux-persist'; -import { RootState } from '../../stores'; -import { startListening } from '../../stores/middleware/listener.middleware'; -import { setToken } from './user.reducer'; - - +import { PayloadAction, createSlice } from '@reduxjs/toolkit' +import { RoutineManager } from '@utils/routine.manager' +import { REHYDRATE } from 'redux-persist' +import { RootState } from '../../stores' +import { startListening } from '../../stores/middleware/listener.middleware' +import { setToken } from './user.reducer' interface ThunkEntityDTO { - thunk: any, + thunk: any payload: any /** * Only one subscription per category is allowed. New subscription will unsubscribe and overwrite the old one */ - category: CATEGORIES, + category: CATEGORIES } interface ThunkEntity extends ThunkEntityDTO { - id?: number, - locked: boolean, + id?: number + locked: boolean } export interface ReducerState { - thunks: {[key in keyof typeof CATEGORIES]: ThunkEntity | null} + thunks: { [key in keyof typeof CATEGORIES]: ThunkEntity | null } } export enum CATEGORIES { TABLE, - TAB + TAB, } const initialState: ReducerState = { thunks: { TABLE: null, - TAB: null - } + TAB: null, + }, } const RoutineSlice = createSlice({ name: 'routine', initialState, reducers: { - addRoutine: (state, {payload}: PayloadAction<ThunkEntityDTO>) => { - const newThunk: ThunkEntity = {...payload, locked: true}; - state.thunks[CATEGORIES[payload.category]] = newThunk; + addRoutine: (state: any, { payload }: PayloadAction<ThunkEntityDTO>) => { + const newThunk: ThunkEntity = { ...payload, locked: true } + state.thunks[CATEGORIES[payload.category]] = newThunk }, - setThunkId: (state, {payload}: PayloadAction<{id: number, category: CATEGORIES}>) => { - let thunk = state.thunks[CATEGORIES[payload.category]]; + setThunkId: (state, { payload }: PayloadAction<{ id: number; category: CATEGORIES }>) => { + const thunk = state.thunks[CATEGORIES[payload.category]] if (!thunk) { // TODO - throw new Error('Thunk not found'); + throw new Error('Thunk not found') } - - state.thunks[CATEGORIES[payload.category]] = {...thunk, id: payload.id, locked: false}; + + state.thunks[CATEGORIES[payload.category]] = { ...thunk, id: payload.id, locked: false } }, removeAll: (state) => { - state.thunks = initialState.thunks; + state.thunks = initialState.thunks }, }, }) @@ -71,34 +69,34 @@ startListening({ predicate: (action) => setToken.match(action) && action.payload === null, effect: async (_, listenerApi) => { RoutineManager.unsubscribeAll() - listenerApi.dispatch(RoutineSlice.actions.removeAll()); + listenerApi.dispatch(RoutineSlice.actions.removeAll()) }, }) // on rehydrate add all persistet routines startListening({ - predicate: ({type}) => type === REHYDRATE, + predicate: ({ type }) => type === REHYDRATE, effect: async (_, listenerApi) => { - const {routine} = listenerApi.getState() as RootState; - for (const [_,thunk] of Object.entries<ThunkEntity>(routine.thunks)) { + const { routine } = listenerApi.getState() as RootState + for (const [_, thunk] of Object.entries<ThunkEntity>(routine.thunks)) { if (!thunk) { - return; + return } - const dto: ThunkEntityDTO = thunk; - listenerApi.dispatch(addRoutine(dto)); + const dto: ThunkEntityDTO = thunk + listenerApi.dispatch(addRoutine(dto)) } }, }) -// unsubscribe old routine +// unsubscribe old routine startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const {routine} = listenerApi.getOriginalState() as RootState; - const lastThunk = routine.thunks[CATEGORIES[action.payload.category]]; + const { routine } = listenerApi.getOriginalState() as RootState + const lastThunk = routine.thunks[CATEGORIES[action.payload.category]] if (lastThunk) { - RoutineManager.unsubscribe(lastThunk.id); + RoutineManager.unsubscribe(lastThunk.id) } }, }) @@ -107,12 +105,13 @@ startListening({ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const {thunk} = action.payload as ThunkEntity; - const subscription = await listenerApi.dispatch(thunk(action.payload.payload)); - const thunkId = await RoutineManager.add(subscription.payload); - listenerApi.dispatch(RoutineSlice.actions.setThunkId({id: thunkId, category: action.payload.category})); + const { thunk } = action.payload as ThunkEntity + const subscription = await listenerApi.dispatch(thunk(action.payload.payload)) + const thunkId = await RoutineManager.add(subscription.payload) + listenerApi.dispatch( + RoutineSlice.actions.setThunkId({ id: thunkId, category: action.payload.category }) + ) }, }) - export default RoutineSlice.reducer diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index 5cb782db4..653112db7 100644 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -18,7 +18,7 @@ const initialState = { * The routines objects itself are stored in the RoutineManager. */ export const RoutineManager = (() => { - let state = initialState; + const state = initialState; const add = (routine: Routine): number => { const id = state.routines.length; diff --git a/react-ui/src/shared/utils/yang_parser/go/.gitignore b/react-ui/src/shared/utils/yang_parser/go/.gitignore new file mode 100644 index 000000000..4be9e9e37 --- /dev/null +++ b/react-ui/src/shared/utils/yang_parser/go/.gitignore @@ -0,0 +1 @@ +/openconfig \ No newline at end of file diff --git a/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated b/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated new file mode 100644 index 000000000..ab9e80009 --- /dev/null +++ b/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated @@ -0,0 +1,18 @@ +declare namespace globalThis { + let fs: FileSystem + let process: Process + let crypto: Crypto + let TextEncoder: { new (encoding: string): TextEncoder } + let TextDecoder: { new (encoding: string): TextDecoder } + let Go: typeof Go +} + +interface Go { + argv: string[] + env: { [envKey: string]: string } + exit: (code: number) => void + importObject: WebAssembly.Imports + exited: boolean + mem: DataView + run(instance: WebAssembly.Instance): Promise<void> +} diff --git a/react-ui/src/shared/utils/yang_parser/go/go.env b/react-ui/src/shared/utils/yang_parser/go/go.env new file mode 100644 index 000000000..6a9eb46ee --- /dev/null +++ b/react-ui/src/shared/utils/yang_parser/go/go.env @@ -0,0 +1 @@ +GOPROXY="direct" \ No newline at end of file diff --git a/react-ui/src/shared/utils/yang_parser/go/go.mod b/react-ui/src/shared/utils/yang_parser/go/go.mod new file mode 100644 index 000000000..cd6a54898 --- /dev/null +++ b/react-ui/src/shared/utils/yang_parser/go/go.mod @@ -0,0 +1,18 @@ +module yang_parser + +go 1.21.0 + +require ( + github.com/golang/glog v1.2.2 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/openconfig/gnmi v0.11.0 // indirect + github.com/openconfig/goyang v1.6.0 // indirect + github.com/openconfig/ygot v0.29.20 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.17.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.35.1 // indirect +) diff --git a/react-ui/src/shared/utils/yang_parser/go/go.sum b/react-ui/src/shared/utils/yang_parser/go/go.sum new file mode 100644 index 000000000..fe012ebb7 --- /dev/null +++ b/react-ui/src/shared/utils/yang_parser/go/go.sum @@ -0,0 +1,171 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/openconfig/gnmi v0.10.0/go.mod h1:Y9os75GmSkhHw2wX8sMsxfI7qRGAEcDh8NTa5a8vj6E= +github.com/openconfig/gnmi v0.11.0 h1:H7pLIb/o3xObu3+x0Fv9DCK7TH3FUh7mNwbYe+34hFw= +github.com/openconfig/gnmi v0.11.0/go.mod h1:9oJSQPPCpNvfMRj8e4ZoLVAw4wL8HyxXbiDlyuexCGU= +github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU= +github.com/openconfig/goyang v1.6.0 h1:JjnPbLY1/y28VyTO67LsEV0TaLWNiZyDcsppGq4F4is= +github.com/openconfig/goyang v1.6.0/go.mod h1:sdNZi/wdTZyLNBNfgLzmmbi7kISm7FskMDKKzMY+x1M= +github.com/openconfig/grpctunnel v0.0.0-20220819142823-6f5422b8ca70/go.mod h1:OmTWe7RyZj2CIzIgy4ovEBzCLBJzRvWSZmn7u02U9gU= +github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs= +github.com/openconfig/ygot v0.29.20 h1:XHLpwCN91QuKc2LAvnEqtCmH8OuxgLlErDhrdl2mJw8= +github.com/openconfig/ygot v0.29.20/go.mod h1:K8HbrPm/v8/emtGQ9+RsJXx6UPKC5JzS/FqK7pN+tMo= +github.com/pborman/getopt v1.1.0/go.mod h1:FxXoW1Re00sQG/+KIkuSqRL/LwQgSkv7uyac+STFsbk= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/protocolbuffers/txtpbfmt v0.0.0-20220608084003-fc78c767cd6a/go.mod h1:KjY0wibdYKc4DYkerHSbguaf3JeIPGhNJBp2BNiFH78= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210811021853-ddbe55d93216/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/react-ui/src/shared/utils/yang_parser/go/yang_parser.go b/react-ui/src/shared/utils/yang_parser/go/yang_parser.go new file mode 100644 index 000000000..4314d0eb1 --- /dev/null +++ b/react-ui/src/shared/utils/yang_parser/go/yang_parser.go @@ -0,0 +1,39 @@ +package main + +import ( + "fmt" + "syscall/js" + "yang_parser/openconfig" + + "github.com/openconfig/ygot/ygot" +) + +func ParseYANGFile(this js.Value, p []js.Value) interface{} { + device := &openconfig.Device{} + + yangContent := p[0].String() + + if err := openconfig.Unmarshal([]byte(yangContent), device); err != nil { + panic(fmt.Sprintf("Cannot unmarshal JSON: %v", err)) + } + + json, err := ygot.EmitJSON(device, &ygot.EmitJSONConfig{ + Format: ygot.RFC7951, + Indent: " ", + RFC7951Config: &ygot.RFC7951JSONConfig{ + AppendModuleName: true, + }, + }) + + if err != nil { + panic(fmt.Sprintf("Cannot emit json: %v ", err)) + } + + return js.ValueOf(string(json)) +} + +func main() { + js.Global().Set("parseYANG", js.FuncOf(ParseYANGFile)) + + select {} +} diff --git a/react-ui/src/shared/utils/yang_parser/yang_parser.ts b/react-ui/src/shared/utils/yang_parser/yang_parser.ts new file mode 100644 index 000000000..d6ca3201c --- /dev/null +++ b/react-ui/src/shared/utils/yang_parser/yang_parser.ts @@ -0,0 +1,38 @@ +import '@build/wasm/wasm_exec.js' + +import { useEffect, useRef } from 'react' + +export const useYangParser = () => { + const wasm = useRef<Promise<ArrayBuffer>>() + const go = useRef(new Go()) + + useEffect(() => { + wasm.current = fetch('/build/wasm/yang_parser.wasm') + .then((response) => response.arrayBuffer()) + .then((bytes) => bytes) + }, []) + + /** + * Parses yang model that the backend responses to a JSON object + * + * @param uniformYang + * @returns + */ + const parse = async (modifiedYang: string): Promise<JSON> => { + try { + const bytes = await wasm.current + const { instance } = await WebAssembly.instantiate(bytes!, go.current.importObject) + go.current.run(instance) + + const jsonString = parseYANG(modifiedYang) + return JSON.parse(jsonString) + } catch (err) { + console.log('Error' + err) + return Promise.reject(err) + } + } + + return { + parse, + } +} diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index bda77de7e..c97edc465 100644 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,27 +1,25 @@ -import deviceReducer from "@component/devices/reducer/device.reducer"; -import routineReducer from "@shared/reducer/routine.reducer"; -import userReducer from "@shared/reducer/user.reducer"; -import { combineReducers } from "redux"; -import { persistReducer } from "redux-persist"; -import storage from "redux-persist/es/storage"; -import { emptySplitApi } from "./api.store"; - +import deviceReducer from '@component/devices/reducer/device.reducer' +import routineReducer from '@shared/reducer/routine.reducer' +import userReducer from '@shared/reducer/user.reducer' +import { combineReducers } from 'redux' +import { persistReducer } from 'redux-persist' +import storage from 'redux-persist/es/storage' +import { emptySplitApi } from './api.store' /** local storage config */ const rootPersistConfig = { key: 'root', storage, - blacklist: [emptySplitApi.reducerPath, ], + blacklist: [emptySplitApi.reducerPath], } - const rootReducer = combineReducers({ - user: userReducer, - device: deviceReducer, - routine: routineReducer, + user: userReducer, + device: deviceReducer, + routine: routineReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) const persistedReducer = persistReducer(rootPersistConfig, rootReducer) -export default persistedReducer; \ No newline at end of file +export default persistedReducer diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 6cfd61712..10cd20012 100644 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -9,13 +9,13 @@ /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, - "resolveJsonModule": true, "isolatedModules": true, + "moduleDetection": "force", "noEmit": true, "jsx": "react-jsx", /* Linting */ - "strict": false, + "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, @@ -33,7 +33,8 @@ "@helper/*": ["src/shared/helper/*"], "@utils/*": ["src/shared/utils/*"], "@shared/*": ["src/shared/*"], - "@component/*": ["src/components/*"] + "@component/*": ["src/components/*"], + "@build/*": ["build/*"] } }, "include": [ @@ -41,7 +42,8 @@ "src/**/*.ts", "src/**/*.tsx", "src/stores/api.store.ts", - "scripts/test.ts" + "scripts/test.ts", + "src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated" ] //"references": [{ "path": "./tsconfig.node.json" }] } diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index bdff7502a..3bf58a286 100644 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -1,8 +1,13 @@ import react from '@vitejs/plugin-react' import { defineConfig } from 'vite' +import topLevelAwait from 'vite-plugin-top-level-await' +import wasm from 'vite-plugin-wasm' export default defineConfig({ - plugins: [react()], + plugins: [react(), wasm(), topLevelAwait()], + build: { + sourcemap: true, + }, server: { port: 3000, proxy: { @@ -16,11 +21,7 @@ export default defineConfig({ console.log('proxy error', err) }) proxy.on('proxyReq', (proxyReq, req, _res) => { - console.log( - 'Sending Request to the Target:', - req.method, - req.url - ) + console.log('Sending Request to the Target:', req.method, req.url) }) proxy.on('proxyRes', (proxyRes, req, _res) => { console.log( @@ -47,10 +48,7 @@ export default defineConfig({ '@utils': '/src/shared/utils', '@shared': '/src/shared', '@component': '/src/components', + '@build': '/build/', }, }, - - build: { - sourcemap: true, // Source Maps für den Build aktivieren - }, }) diff --git a/react-ui/yang_model b/react-ui/yang_model deleted file mode 160000 index 3a3018590..000000000 --- a/react-ui/yang_model +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3a3018590be5f7c11a3ed8c3530b128c53633d7b diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index df07efe2b..a52172744 100644 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -1161,6 +1161,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.20.13": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" @@ -1435,15 +1442,20 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== -"@eslint/config-array@^0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910" - integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA== +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== dependencies: "@eslint/object-schema" "^2.1.4" debug "^4.3.1" minimatch "^3.1.2" +"@eslint/core@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.7.0.tgz#a1bb4b6a4e742a5ff1894b7ee76fbf884ec72bd3" + integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -1479,16 +1491,23 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@eslint/js@9.8.0": - version "9.8.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.8.0.tgz#ae9bc14bb839713c5056f5018bcefa955556d3a4" - integrity sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA== +"@eslint/js@9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.13.0.tgz#c5f89bcd57eb54d5d4fa8b77693e9c28dc97e547" + integrity sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA== "@eslint/object-schema@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== +"@eslint/plugin-kit@^0.2.0": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz#5eff371953bc13e3f4d88150e2c53959f64f74f6" + integrity sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw== + dependencies: + levn "^0.4.1" + "@exodus/schemasafe@^1.0.0-rc.2": version "1.3.0" resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" @@ -1527,6 +1546,19 @@ dependencies: prop-types "^15.8.1" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.5": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -1551,6 +1583,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== +"@humanwhocodes/retry@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1967,6 +2004,11 @@ "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" +"@rollup/plugin-virtual@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz#17e17eeecb4c9fa1c0a6e72c9e5f66382fddbb82" + integrity sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A== + "@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" @@ -1976,85 +2018,85 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/rollup-android-arm-eabi@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz#c3f5660f67030c493a981ac1d34ee9dfe1d8ec0f" - integrity sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA== - -"@rollup/rollup-android-arm64@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz#64161f0b67050023a3859e723570af54a82cff5c" - integrity sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ== - -"@rollup/rollup-darwin-arm64@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz#25f3d57b1da433097cfebc89341b355901615763" - integrity sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q== - -"@rollup/rollup-darwin-x64@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz#d8ddaffb636cc2f59222c50316e27771e48966df" - integrity sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz#41bd4fcffa20fb84f3dbac6c5071638f46151885" - integrity sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA== - -"@rollup/rollup-linux-arm-musleabihf@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz#842077c5113a747eb5686f19f2f18c33ecc0acc8" - integrity sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw== - -"@rollup/rollup-linux-arm64-gnu@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz#65d1d5b6778848f55b7823958044bf3e8737e5b7" - integrity sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ== - -"@rollup/rollup-linux-arm64-musl@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz#50eef7d6e24d0fe3332200bb666cad2be8afcf86" - integrity sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q== - -"@rollup/rollup-linux-powerpc64le-gnu@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz#8837e858f53c84607f05ad0602943e96d104c6b4" - integrity sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw== - -"@rollup/rollup-linux-riscv64-gnu@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz#c894ade2300caa447757ddf45787cca246e816a4" - integrity sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA== - -"@rollup/rollup-linux-s390x-gnu@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz#5841e5390d4c82dd5cdf7b2c95a830e3c2f47dd3" - integrity sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg== - -"@rollup/rollup-linux-x64-gnu@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz#cc1f26398bf777807a99226dc13f47eb0f6c720d" - integrity sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew== - -"@rollup/rollup-linux-x64-musl@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz#1507465d9056e0502a590d4c1a00b4d7b1fda370" - integrity sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg== - -"@rollup/rollup-win32-arm64-msvc@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz#86a221f01a2c248104dd0defb4da119f2a73642e" - integrity sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA== - -"@rollup/rollup-win32-ia32-msvc@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz#8bc8f77e02760aa664694b4286d6fbea7f1331c5" - integrity sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A== - -"@rollup/rollup-win32-x64-msvc@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz#601fffee719a1e8447f908aca97864eec23b2784" - integrity sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg== +"@rollup/rollup-android-arm-eabi@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54" + integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA== + +"@rollup/rollup-android-arm64@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e" + integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA== + +"@rollup/rollup-darwin-arm64@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz#627007221b24b8cc3063703eee0b9177edf49c1f" + integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA== + +"@rollup/rollup-darwin-x64@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz#0605506142b9e796c370d59c5984ae95b9758724" + integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb" + integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA== + +"@rollup/rollup-linux-arm-musleabihf@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3" + integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw== + +"@rollup/rollup-linux-arm64-gnu@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496" + integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA== + +"@rollup/rollup-linux-arm64-musl@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065" + integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d" + integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw== + +"@rollup/rollup-linux-riscv64-gnu@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983" + integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg== + +"@rollup/rollup-linux-s390x-gnu@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58" + integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g== + +"@rollup/rollup-linux-x64-gnu@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b" + integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A== + +"@rollup/rollup-linux-x64-musl@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127" + integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ== + +"@rollup/rollup-win32-arm64-msvc@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5" + integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ== + +"@rollup/rollup-win32-ia32-msvc@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2" + integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ== + +"@rollup/rollup-win32-x64-msvc@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" + integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== "@rtk-query/codegen-openapi@^1.2.0": version "1.2.0" @@ -2206,6 +2248,80 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" +"@swc/core-darwin-arm64@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.36.tgz#f50ecd4db72a8759c67c1eb93f942c6331e6cfe9" + integrity sha512-8vDczXzCgv3ceTPhEivlpGprN44YlrCK1nbfU9g2TrhV/Aiqi09W/eM5zLesdoM1Z3mJl492gc/8nlTkpDdusw== + +"@swc/core-darwin-x64@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.7.36.tgz#14c7e5c0a9bee4ffcf05a5a62caa179ee01a68c2" + integrity sha512-Pa2Gao7+Wf5m3SsK4abKRtd48AtoUnJInvaC3d077swBfgZjbjUbQvcpdc2dOeQtWwo49rFqUZJonMsL0jnPgQ== + +"@swc/core-linux-arm-gnueabihf@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.36.tgz#19d9a66606ae9fc09f3e087a1ef49d75ffd769e7" + integrity sha512-3YsMWd7V+WZEjbfBnLkkz/olcRBa8nyoK0iIOnNARJBMcYaJxjkJSMZpmSojCnIVwvjA1N83CPAbUL+W+fCnHg== + +"@swc/core-linux-arm64-gnu@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.36.tgz#9834e507e75d1689913fc56d401d5921eb75be67" + integrity sha512-lqM3aBB7kJazJYOwHeA5OGNLqXoQPZ/76b3dV+XcjN1GhD0CcXz6mW5PRYVin6OSN1eKrKBKJjtDA1mqADDEvw== + +"@swc/core-linux-arm64-musl@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.36.tgz#548abbec7581f06ab9f38bd6c289bd7fc9983452" + integrity sha512-bqei2YDzvUfG0pth5W2xJaj0eG4XWYk0d/NJ75vBX6bkIzK6dC8iuKQ41jOfUWonnrAs7rTDDJW0sTn/evvRdw== + +"@swc/core-linux-x64-gnu@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.36.tgz#d2a4a8edcdb3b7646dade9783d6502d01ff9364c" + integrity sha512-03maXTUyaBjeCxlDltmdzHje1ryQt1C4OWmmNgSSRXjLb+GNnAenwOJMSrcvHP/aNClD2pwsFCnYKDGy+sYE6w== + +"@swc/core-linux-x64-musl@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.36.tgz#ea4197cbcc23b1202cdbec82a05bee9b29aa341b" + integrity sha512-XXysqLkvjtQnXm1zHqLhy00UYPv/gk5OtwR732X+piNisnEbcJBqI8Qp9O7YvLWllRcoP8IMBGDWLGdGLSpViA== + +"@swc/core-win32-arm64-msvc@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.36.tgz#1b100b809457d0ed5710956d7efb4fd0427dc2c8" + integrity sha512-k7+dmb13a/zPw+E4XYfPmLZFWJgcOcBRKIjYl9nQErtYsgsg3Ji6TBbsvJVETy23lNHyewZ17V5Vq6NzaG0hzg== + +"@swc/core-win32-ia32-msvc@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.36.tgz#577e7f25a7a8496c16e9b14486cd849765bccba5" + integrity sha512-ridD3ay6YM2PEYHZXXFN+edYEv0FOynaqOBP+NSnGNHA35azItIjoIe+KNi4WltGtAjpKCHSpjGCNfna12wdYQ== + +"@swc/core-win32-x64-msvc@1.7.36": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.36.tgz#f85ace043925a746ff40af2da1ff9ff9760525bb" + integrity sha512-j1z2Z1Ln9d0E3dHsPkC1K9XDh0ojhRPwV+GfRTu4D61PE+aYhYLvbJC6xPvL4/204QrStRS7eDu3m+BcDp3rgQ== + +"@swc/core@^1.7.0": + version "1.7.36" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.36.tgz#369b67cfe7be039dac2ab2180b44da8f2f8c2af0" + integrity sha512-bu7ymMX+LCJOSSrKank25Jaq66ymLVA9fOUuy4ck3/6rbXdLw+pIJPnIDKQ9uNcxww8KDxOuJk9Ui9pqR+aGFw== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.13" + optionalDependencies: + "@swc/core-darwin-arm64" "1.7.36" + "@swc/core-darwin-x64" "1.7.36" + "@swc/core-linux-arm-gnueabihf" "1.7.36" + "@swc/core-linux-arm64-gnu" "1.7.36" + "@swc/core-linux-arm64-musl" "1.7.36" + "@swc/core-linux-x64-gnu" "1.7.36" + "@swc/core-linux-x64-musl" "1.7.36" + "@swc/core-win32-arm64-msvc" "1.7.36" + "@swc/core-win32-ia32-msvc" "1.7.36" + "@swc/core-win32-x64-msvc" "1.7.36" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + "@swc/helpers@^0.5.0": version "0.5.12" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" @@ -2213,6 +2329,13 @@ dependencies: tslib "^2.4.0" +"@swc/types@^0.1.13": + version "0.1.13" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.13.tgz#441734f8bfa6e9e738f1c68e98be6da282ecc7db" + integrity sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q== + dependencies: + "@swc/counter" "^0.1.3" + "@testing-library/jest-dom@^6.4.8": version "6.4.8" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz#9c435742b20c6183d4e7034f2b329d562c079daa" @@ -2336,7 +2459,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -2346,6 +2469,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/estree@1.0.6", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.19.5" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" @@ -2409,7 +2537,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2584,6 +2712,21 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.0.tgz#2089acb441fb5e0171e1b4cfb4291d22fb3779c0" + integrity sha512-uRqchEKT0/OwDePTwCjSFO2aH4zccdeQ7DgAzM/8fuXc+PAXvpdMRbuo+oCmK1lSfXssk2UUBNiWihobKxQp/g== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.12.0" + "@typescript-eslint/type-utils" "8.12.0" + "@typescript-eslint/utils" "8.12.0" + "@typescript-eslint/visitor-keys" "8.12.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/eslint-plugin@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -2622,6 +2765,17 @@ dependencies: "@typescript-eslint/utils" "5.62.0" +"@typescript-eslint/parser@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.12.0.tgz#e9a9c047310213169dd500b08622c5641f1997f6" + integrity sha512-7U20duDQWAOhCk2VtyY41Vor/CJjiEW063Zel9aoRXq89FQ/jr+0e0m3kxh9Sk5SFW9B1AblVIBtXd+1xQ1NWQ== + dependencies: + "@typescript-eslint/scope-manager" "8.12.0" + "@typescript-eslint/types" "8.12.0" + "@typescript-eslint/typescript-estree" "8.12.0" + "@typescript-eslint/visitor-keys" "8.12.0" + debug "^4.3.4" + "@typescript-eslint/parser@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" @@ -2659,6 +2813,14 @@ "@typescript-eslint/types" "8.0.1" "@typescript-eslint/visitor-keys" "8.0.1" +"@typescript-eslint/scope-manager@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.12.0.tgz#de23a4a652773efdd558c7e5ff7b734736f14318" + integrity sha512-jbuCXK18iEshRFUtlCIMAmOKA6OAsKjo41UcXPqx7ZWh2b4cmg6pV/pNcZSB7oW9mtgF95yizr7Jnwt3IUD2pA== + dependencies: + "@typescript-eslint/types" "8.12.0" + "@typescript-eslint/visitor-keys" "8.12.0" + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -2679,6 +2841,16 @@ debug "^4.3.4" ts-api-utils "^1.3.0" +"@typescript-eslint/type-utils@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.12.0.tgz#d1e2d2ed0b2cb5bca35312b085379fcfb5c812be" + integrity sha512-cHioAZO/nLgyzTmwv7gWIjEKMHSbioKEZqLCaItTn7RvJP1QipuGVwEjPJa6Kv9u9UiUMVAESY9JH186TjKITw== + dependencies: + "@typescript-eslint/typescript-estree" "8.12.0" + "@typescript-eslint/utils" "8.12.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" @@ -2689,6 +2861,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.0.1.tgz#333e2f4c158952dbc8181a4ddcc6e49898a28918" integrity sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw== +"@typescript-eslint/types@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.12.0.tgz#f35d846af8e2248a7e2136fe714a42be3b3154ef" + integrity sha512-Cc+iNtqBJ492f8KLEmKXe1l6683P0MlFO8Bk1NMphnzVIGH4/Wn9kvandFH+gYR1DDUjH/hgeWRGdO5Tj8gjYg== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -2716,6 +2893,20 @@ semver "^7.6.0" ts-api-utils "^1.3.0" +"@typescript-eslint/typescript-estree@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.0.tgz#6e087bd46f7682c07e971fb1d9dfa5bdc6f45f64" + integrity sha512-a4koVV7HHVOQWcGb6ZcAlunJnAdwo/CITRbleQBSjq5+2WLoAJQCAAiecvrAdSM+n/man6Ghig5YgdGVIC6xqw== + dependencies: + "@typescript-eslint/types" "8.12.0" + "@typescript-eslint/visitor-keys" "8.12.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -2740,6 +2931,16 @@ "@typescript-eslint/types" "8.0.1" "@typescript-eslint/typescript-estree" "8.0.1" +"@typescript-eslint/utils@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.12.0.tgz#2967a5915ad4c500486341c79c0cfbc4f276bf47" + integrity sha512-5i1tqLwlf0fpX1j05paNKyIzla/a4Y3Xhh6AFzi0do/LDJLvohtZYaisaTB9kq0D4uBocAxWDTGzNMOCCwIgXA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.12.0" + "@typescript-eslint/types" "8.12.0" + "@typescript-eslint/typescript-estree" "8.12.0" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -2756,6 +2957,14 @@ "@typescript-eslint/types" "8.0.1" eslint-visitor-keys "^3.4.3" +"@typescript-eslint/visitor-keys@8.12.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.0.tgz#a9fcd973a546a7c78593d0501debdc9ebab8b340" + integrity sha512-2rXkr+AtZZLuNY18aUjv5wtB9oUiwY1WnNi7VTsdCdy1m958ULeUKoAegldQTjqpbpNJ5cQ4egR8/bh5tbrKKQ== + dependencies: + "@typescript-eslint/types" "8.12.0" + eslint-visitor-keys "^3.4.3" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -2929,41 +3138,22 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== -acorn-jsx-walk@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz#a5ed648264e68282d7c2aead80216bfdf232573a" - integrity sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA== - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-loose@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.4.0.tgz#26d3e219756d1e180d006f5bcc8d261a28530f55" - integrity sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ== - dependencies: - acorn "^8.11.0" - acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.3.4: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.11.0, acorn@^8.12.0, acorn@^8.12.1, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.12.0, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -3022,7 +3212,7 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.17.1, ajv@^8.6.0, ajv@^8.6.3, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.6.3, ajv@^8.9.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -3239,7 +3429,7 @@ arraybuffer.prototype.slice@^1.0.3: is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" -asap@~2.0.6: +asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== @@ -3436,6 +3626,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -3567,6 +3762,11 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -3796,11 +3996,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3836,11 +4031,6 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -"comparse@>= 0.9.x", comparse@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/comparse/-/comparse-0.9.3.tgz#2ce73a4895e0ee1b333db11689c2f55c0ff9a962" - integrity sha512-wg/zg7YsMomMF9LP+LNSaw4IO7b/M4VLCmidZ9+wbYkZNXTkVNMFMgMZAu/7967BGsTn+14KZUT/pyyTBuZrTQ== - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -3952,6 +4142,13 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4302,11 +4499,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4317,34 +4509,6 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dependency-cruiser@^16.4.2: - version "16.4.2" - resolved "https://registry.yarnpkg.com/dependency-cruiser/-/dependency-cruiser-16.4.2.tgz#586487e1ac355912a0ad2310b830b63054733e01" - integrity sha512-mQZM95WwIvKzYYdj+1RgIBuJ6qbr1cfyzTt62dDJVrWAShfhV9IEkG/Xv4S2iD5sT+Gt3oFWyZjwNufAhcbtWA== - dependencies: - acorn "^8.12.1" - acorn-jsx "^5.3.2" - acorn-jsx-walk "^2.0.0" - acorn-loose "^8.4.0" - acorn-walk "^8.3.4" - ajv "^8.17.1" - commander "^12.1.0" - enhanced-resolve "^5.17.1" - ignore "^6.0.2" - interpret "^3.1.1" - is-installed-globally "^1.0.0" - json5 "^2.2.3" - memoize "^10.0.0" - picocolors "^1.1.0" - picomatch "^4.0.2" - prompts "^2.4.2" - rechoir "^0.8.0" - safe-regex "^2.1.1" - semver "^7.6.3" - teamcity-service-messages "^0.1.14" - tsconfig-paths-webpack-plugin "^4.1.0" - watskeburt "^4.1.0" - dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -4569,7 +4733,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^5.17.0, enhanced-resolve@^5.17.1, enhanced-resolve@^5.7.0: +enhanced-resolve@^5.17.0: version "5.17.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -4945,15 +5109,20 @@ eslint-plugin-prettier@^5.2.1: prettier-linter-helpers "^1.0.0" synckit "^0.9.1" -eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: +eslint-plugin-react-hooks@^4.3.0: version "4.6.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -eslint-plugin-react-refresh@^0.4.6: - version "0.4.9" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz#bf870372b353b12e1e6fb7fc41b282d9cbc8d93d" - integrity sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA== +eslint-plugin-react-hooks@^5.1.0-rc.0: + version "5.1.0-rc-fb9a90fa48-20240614" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz#206a7ec005f0b286aaf7091f4e566083d310b189" + integrity sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w== + +eslint-plugin-react-refresh@^0.4.9: + version "0.4.14" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.14.tgz#e3c611ead69bbf7436d01295c853d4abb8c59f68" + integrity sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA== eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.2: version "7.35.0" @@ -5002,10 +5171,10 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" - integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== +eslint-scope@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" + integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -5025,6 +5194,11 @@ eslint-visitor-keys@^4.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== +eslint-visitor-keys@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" + integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== + eslint-webpack-plugin@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" @@ -5080,27 +5254,31 @@ eslint@^8.3.0: strip-ansi "^6.0.1" text-table "^0.2.0" -eslint@^9.8.0: - version "9.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.8.0.tgz#a4f4a090c8ea2d10864d89a6603e02ce9f649f0f" - integrity sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A== +eslint@^9.9.0: + version "9.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.13.0.tgz#7659014b7dda1ff876ecbd990f726e11c61596e6" + integrity sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.11.0" - "@eslint/config-array" "^0.17.1" + "@eslint/config-array" "^0.18.0" + "@eslint/core" "^0.7.0" "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.8.0" + "@eslint/js" "9.13.0" + "@eslint/plugin-kit" "^0.2.0" + "@humanfs/node" "^0.16.5" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.0" - "@nodelib/fs.walk" "^1.2.8" + "@humanwhocodes/retry" "^0.3.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.0.2" - eslint-visitor-keys "^4.0.0" - espree "^10.1.0" + eslint-scope "^8.1.0" + eslint-visitor-keys "^4.1.0" + espree "^10.2.0" esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -5110,17 +5288,14 @@ eslint@^9.8.0: ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" 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.3" - strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^10.0.1, espree@^10.1.0: +espree@^10.0.1: version "10.1.0" resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== @@ -5129,6 +5304,15 @@ espree@^10.0.1, espree@^10.1.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.0.0" +espree@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" + integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.1.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -5274,7 +5458,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -5326,6 +5510,31 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + 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.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== + 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 "^1.0.35" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -5434,6 +5643,14 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +flux@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" + integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.1" + follow-redirects@^1.0.0: version "1.15.6" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" @@ -5639,13 +5856,6 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -5679,6 +5889,11 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== +globals@^15.9.0: + version "15.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.11.0.tgz#b96ed4c6998540c6fb824b24b5499216d2438d6e" + integrity sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw== + globalthis@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -5978,11 +6193,6 @@ ignore@^5.2.0, ignore@^5.3.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -ignore@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-6.0.2.tgz#77cccb72a55796af1b6d2f9eb14fa326d24f4283" - integrity sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A== - immer@^10.0.3: version "10.1.1" resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" @@ -6006,6 +6216,14 @@ import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from-esm@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/import-from-esm/-/import-from-esm-1.3.4.tgz#39e97c84085e308fe66cf872a667046b45449df0" + integrity sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg== + dependencies: + debug "^4.3.4" + import-meta-resolve "^4.0.0" + import-local@^3.0.2: version "3.2.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" @@ -6014,18 +6232,16 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-meta-resolve@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg== - dependencies: - repeating "^2.0.0" - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -6049,11 +6265,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -6068,11 +6279,6 @@ internal-slot@^1.0.4, internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6183,11 +6389,6 @@ is-finalizationregistry@^1.0.2: dependencies: call-bind "^1.0.2" -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -6212,14 +6413,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-installed-globally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" - integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== - dependencies: - global-directory "^4.0.1" - is-path-inside "^4.0.0" - is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -6257,11 +6450,6 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-path-inside@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" - integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== - is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -7034,7 +7222,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -7196,16 +7384,21 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -7307,13 +7500,6 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" -memoize@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/memoize/-/memoize-10.0.0.tgz#43fa66b2022363c7c50cf5dfab732a808a3d7147" - integrity sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA== - dependencies: - mimic-function "^5.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -7369,11 +7555,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7502,7 +7683,7 @@ node-fetch-h2@^2.3.0: dependencies: http2-client "^1.2.5" -node-fetch@^2.6.1: +node-fetch@^2.6.1, node-fetch@^2.6.12: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -7629,7 +7810,7 @@ oazapfts@^4.8.0: swagger2openapi "^7.0.8" typescript "^5.2.2" -object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -7945,11 +8126,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8522,7 +8698,7 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.39, postcss@^8.4.4: +postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: version "8.4.41" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== @@ -8531,6 +8707,15 @@ postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.39, postcss@^8.4. picocolors "^1.0.1" source-map-js "^1.2.0" +postcss@^8.4.43: + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.0" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8595,6 +8780,13 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + promise@^8.1.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -8645,6 +8837,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -8708,6 +8905,16 @@ react-app-polyfill@^3.0.0: regenerator-runtime "^0.13.9" whatwg-fetch "^3.6.2" +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + react-bootstrap@^2.10.2: version "2.10.4" resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.4.tgz#ed92f5f8225a44919a7707829bac879558b71b70" @@ -8792,6 +8999,16 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -8885,6 +9102,15 @@ react-scripts@5.0.1: optionalDependencies: fsevents "^2.3.2" +react-textarea-autosize@^8.3.2: + version "8.5.4" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.4.tgz#1c568ad838857b6ce86ee2a96e504179305e0bf4" + integrity sha512-eSSjVtRLcLfFwFcariT77t9hcbVJHQV76b51QjQGarQIHml2+gM2lms0n3XrhnDmgK5B+/Z7TmQk5OHNzqYm/A== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + react-toastify@^10.0.5: version "10.0.5" resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-10.0.5.tgz#6b8f8386060c5c856239f3036d1e76874ce3bd1e" @@ -8945,13 +9171,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - recursive-readdir@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" @@ -9039,11 +9258,6 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== -regexp-tree@~0.1.1: - version "0.1.27" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" - integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== - regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -9089,13 +9303,6 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== - dependencies: - is-finite "^1.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -9194,6 +9401,16 @@ rollup-plugin-terser@^7.0.0: serialize-javascript "^4.0.0" terser "^5.0.0" +rollup-plugin-visualizer@^5.11.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz#661542191ce78ee4f378995297260d0c1efb1302" + integrity sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ== + dependencies: + open "^8.4.0" + picomatch "^2.3.1" + source-map "^0.7.4" + yargs "^17.5.1" + rollup@^2.43.1: version "2.79.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" @@ -9201,29 +9418,29 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rollup@^4.13.0: - version "4.20.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.20.0.tgz#f9d602161d29e178f0bf1d9f35f0a26f83939492" - integrity sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw== +rollup@^4.20.0: + version "4.24.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.0.tgz#c14a3576f20622ea6a5c9cad7caca5e6e9555d05" + integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.20.0" - "@rollup/rollup-android-arm64" "4.20.0" - "@rollup/rollup-darwin-arm64" "4.20.0" - "@rollup/rollup-darwin-x64" "4.20.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.20.0" - "@rollup/rollup-linux-arm-musleabihf" "4.20.0" - "@rollup/rollup-linux-arm64-gnu" "4.20.0" - "@rollup/rollup-linux-arm64-musl" "4.20.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.20.0" - "@rollup/rollup-linux-riscv64-gnu" "4.20.0" - "@rollup/rollup-linux-s390x-gnu" "4.20.0" - "@rollup/rollup-linux-x64-gnu" "4.20.0" - "@rollup/rollup-linux-x64-musl" "4.20.0" - "@rollup/rollup-win32-arm64-msvc" "4.20.0" - "@rollup/rollup-win32-ia32-msvc" "4.20.0" - "@rollup/rollup-win32-x64-msvc" "4.20.0" + "@rollup/rollup-android-arm-eabi" "4.24.0" + "@rollup/rollup-android-arm64" "4.24.0" + "@rollup/rollup-darwin-arm64" "4.24.0" + "@rollup/rollup-darwin-x64" "4.24.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.24.0" + "@rollup/rollup-linux-arm-musleabihf" "4.24.0" + "@rollup/rollup-linux-arm64-gnu" "4.24.0" + "@rollup/rollup-linux-arm64-musl" "4.24.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.24.0" + "@rollup/rollup-linux-riscv64-gnu" "4.24.0" + "@rollup/rollup-linux-s390x-gnu" "4.24.0" + "@rollup/rollup-linux-x64-gnu" "4.24.0" + "@rollup/rollup-linux-x64-musl" "4.24.0" + "@rollup/rollup-win32-arm64-msvc" "4.24.0" + "@rollup/rollup-win32-ia32-msvc" "4.24.0" + "@rollup/rollup-win32-x64-msvc" "4.24.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -9262,13 +9479,6 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -safe-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" - integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== - dependencies: - regexp-tree "~0.1.1" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -9370,7 +9580,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -9453,6 +9663,11 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -9578,6 +9793,11 @@ source-list-map@^2.0.0, source-list-map@^2.0.1: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + source-map-loader@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" @@ -9600,7 +9820,7 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: +source-map@^0.7.3, source-map@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -9662,13 +9882,6 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -stacktrace-parser@^0.1.4: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - static-eval@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" @@ -10044,11 +10257,6 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -teamcity-service-messages@^0.1.14: - version "0.1.14" - resolved "https://registry.yarnpkg.com/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz#193d420a5e4aef8e5e50b8c39e7865e08fbb5d8a" - integrity sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w== - temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" @@ -10131,6 +10339,11 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -10197,15 +10410,6 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tsconfig-paths-webpack-plugin@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" - integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.7.0" - tsconfig-paths "^4.1.2" - tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -10216,15 +10420,6 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -10276,11 +10471,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -10340,11 +10530,30 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript-eslint@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.12.0.tgz#507f227097836a8b679108d2a80a3e9f20c5e74a" + integrity sha512-m8aQM4pqc17dcD3BsQzUqVXkcclCspuCCv7GhYlwMWNYAXFV8xJkn8vUM8YxoR78BY6S+NX/J7rfNVaGNLgXgQ== + dependencies: + "@typescript-eslint/eslint-plugin" "8.12.0" + "@typescript-eslint/parser" "8.12.0" + "@typescript-eslint/utils" "8.12.0" + typescript@^5.0.0, typescript@^5.2.2: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +typescript@^5.5.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +ua-parser-js@^1.0.35: + version "1.0.39" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" + integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -10458,6 +10667,23 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + use-sync-external-store@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" @@ -10488,6 +10714,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -10507,14 +10738,38 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite@^5.2.0: - version "5.3.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" - integrity sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA== +vite-bundle-visualizer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vite-bundle-visualizer/-/vite-bundle-visualizer-1.2.1.tgz#8be34033f0216de529abec4b18a8b62aa1b65c9e" + integrity sha512-cwz/Pg6+95YbgIDp+RPwEToc4TKxfsFWSG/tsl2DSZd9YZicUag1tQXjJ5xcL7ydvEoaC2FOZeaXOU60t9BRXw== + dependencies: + cac "^6.7.14" + import-from-esm "^1.3.3" + rollup-plugin-visualizer "^5.11.0" + tmp "^0.2.1" + +vite-plugin-top-level-await@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.4.tgz#4900e06bfb7179de20aaa9b4730d04022a9e259e" + integrity sha512-QyxQbvcMkgt+kDb12m2P8Ed35Sp6nXP+l8ptGrnHV9zgYDUpraO0CPdlqLSeBqvY2DToR52nutDG7mIHuysdiw== + dependencies: + "@rollup/plugin-virtual" "^3.0.2" + "@swc/core" "^1.7.0" + uuid "^10.0.0" + +vite-plugin-wasm@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/vite-plugin-wasm/-/vite-plugin-wasm-3.3.0.tgz#2908ef2529bf8f33f4e549c8c6fda26ad273ca15" + integrity sha512-tVhz6w+W9MVsOCHzxo6SSMSswCeIw4HTrXEi6qL3IRzATl83jl09JVO1djBqPSwfjgnpVHNLYcaMbaDX5WB/pg== + +vite@^5.4.9: + version "5.4.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.9.tgz#215c80cbebfd09ccbb9ceb8c0621391c9abdc19c" + integrity sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg== dependencies: esbuild "^0.21.3" - postcss "^8.4.39" - rollup "^4.13.0" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: fsevents "~2.3.3" @@ -10559,11 +10814,6 @@ watchpack@^2.4.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -watskeburt@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/watskeburt/-/watskeburt-4.1.0.tgz#3c0227669be646a97424b631164b1afe3d4d5344" - integrity sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw== - wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" @@ -11059,13 +11309,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xparse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/xparse/-/xparse-1.0.0.tgz#4775a4bae747c8263ce51af9cef95ee169ac2efd" - integrity sha512-scUtMflBUTA6O72Ic07m58ZzwykVQNWeQRrUgpABDFDOF77/72KxD+JYSPhjy3sItuyHL80NruP0+ucm/lIXQQ== - dependencies: - comparse "^0.9.3" - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -11086,26 +11329,6 @@ yaml@^2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== -yang-js@^0.24.70: - version "0.24.70" - resolved "https://registry.yarnpkg.com/yang-js/-/yang-js-0.24.70.tgz#0b1fbc7b8dee2ff88985b60028439a4335b09161" - integrity sha512-hdb+IZHcQbuhLWmghq10jupVuoUDm+R1K0PATd398P+gby/rYSsma6saagtp9skyvLhYX2M+CvNWxQQBV7Gk7A== - dependencies: - debug "^4.1.1" - delegates "^1.0.0" - indent-string "^2.1.0" - lodash.clonedeep "^4.5.0" - stacktrace-parser "^0.1.4" - xparse "^1.0.0" - yang-parser "^0.2.1" - -yang-parser@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/yang-parser/-/yang-parser-0.2.1.tgz#b937ca78d887b81559c71c608fe9d850ebb7a77a" - integrity sha512-mmZKLVc4NiMdRBK/gnxiT35EP97k9tRDcjwUOenMLabgIm083HVFRfHmch60Wiq+zVWYantdgBcRGLk4Wy1QcA== - dependencies: - comparse ">= 0.9.x" - yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -11129,7 +11352,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.1: +yargs@^17.0.1, yargs@^17.5.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== -- GitLab From 440f9d5399198a2742468942ecc64037eac765eb Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Wed, 6 Nov 2024 15:21:50 +0100 Subject: [PATCH 32/78] add yang parser directly as endpoint to gosdn --- .../gnmi/proto/collector/collector.pb.go | 48 +- .../openconfig/gnmi/proto/gnmi/gnmi.pb.go | 554 +---- .../gnmi/proto/gnmi_ext/gnmi_ext.pb.go | 158 +- .../openconfig/gnmi/proto/target/target.pb.go | 70 +- .../gnmi/testing/fake/proto/fake.pb.go | 488 +---- api/go/gosdn/app/app.pb.go | 92 +- .../configurationmanagement.pb.go | 92 +- api/go/gosdn/conflict/conflict.pb.go | 26 +- api/go/gosdn/csbi/csbi.pb.go | 246 +-- .../gosdn/networkelement/networkelement.pb.go | 1847 +++++++---------- .../networkelement/networkelement.pb.gw.go | 87 + .../networkelement/networkelement_grpc.pb.go | 42 + .../plugin-internal/plugin-internal.pb.go | 92 +- .../plugin-registry/plugin-registry.pb.go | 224 +- api/go/gosdn/plugin/plugin.pb.go | 400 +--- api/go/gosdn/pnd/pnd.pb.go | 224 +- api/go/gosdn/rbac/rbac.pb.go | 92 +- api/go/gosdn/rbac/role.pb.go | 290 +-- api/go/gosdn/rbac/user.pb.go | 268 +-- api/go/gosdn/southbound/southbound.pb.go | 70 +- .../subscriptionmanagement.pb.go | 290 +-- api/go/gosdn/topology/link.pb.go | 26 +- api/go/gosdn/topology/node.pb.go | 26 +- api/go/gosdn/topology/port.pb.go | 48 +- api/go/gosdn/topology/route.pb.go | 48 +- api/go/gosdn/topology/routingTable.pb.go | 136 +- api/go/gosdn/topology/topology.pb.go | 202 +- api/go/gosdn/transport/transport.pb.go | 70 +- api/openapiv2/gosdn_northbound.swagger.json | 52 + api/proto/buf.lock | 12 +- .../gosdn/networkelement/networkelement.proto | 19 + controller/controller.go | 1 + .../northbound/server/networkElement.go | 32 + react-ui/scripts/openapi-config.json | 20 +- .../devices/reducer/device.reducer.ts | 95 +- .../devices/routines/mne.routine.ts | 92 +- .../src/components/devices/view/device.scss | 11 + .../devices/view/device.view.table.tsx | 8 +- .../devices/view/device.view.tabs.tsx | 4 +- .../view_model/device.tabs.viewmodel.ts | 8 +- .../devices/view_model/device.viewmodel.ts | 24 +- react-ui/src/shared/api/api.ts | 237 ++- .../src/shared/provider/auth.provider.tsx | 13 +- .../src/shared/reducer/routine.reducer.ts | 27 +- react-ui/src/shared/reducer/user.reducer.ts | 48 +- react-ui/src/shared/utils/routine.manager.ts | 43 +- react-ui/src/stores/api.store.ts | 27 +- react-ui/src/stores/index.ts | 37 +- .../middleware/api.listener.middleware.ts | 26 + .../middleware/devLogging.middleware.ts | 24 - 50 files changed, 2220 insertions(+), 4896 deletions(-) create mode 100644 react-ui/src/stores/middleware/api.listener.middleware.ts delete mode 100644 react-ui/src/stores/middleware/devLogging.middleware.ts diff --git a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go index a186f9bae..09e16b605 100644 --- a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/collector/collector.proto @@ -46,11 +46,9 @@ type ReconnectRequest struct { func (x *ReconnectRequest) Reset() { *x = ReconnectRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReconnectRequest) String() string { @@ -61,7 +59,7 @@ func (*ReconnectRequest) ProtoMessage() {} func (x *ReconnectRequest) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -91,11 +89,9 @@ type Nil struct { func (x *Nil) Reset() { *x = Nil{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Nil) String() string { @@ -106,7 +102,7 @@ func (*Nil) ProtoMessage() {} func (x *Nil) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -173,32 +169,6 @@ func file_github_com_openconfig_gnmi_proto_collector_collector_proto_init() { if File_github_com_openconfig_gnmi_proto_collector_collector_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*ReconnectRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Nil); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go index aa39f2583..d0162888f 100644 --- a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/gnmi/gnmi.proto @@ -347,11 +347,9 @@ type Notification struct { func (x *Notification) Reset() { *x = Notification{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Notification) String() string { @@ -362,7 +360,7 @@ func (*Notification) ProtoMessage() {} func (x *Notification) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -436,11 +434,9 @@ type Update struct { func (x *Update) Reset() { *x = Update{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Update) String() string { @@ -451,7 +447,7 @@ func (*Update) ProtoMessage() {} func (x *Update) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -528,11 +524,9 @@ type TypedValue struct { func (x *TypedValue) Reset() { *x = TypedValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TypedValue) String() string { @@ -543,7 +537,7 @@ func (*TypedValue) ProtoMessage() {} func (x *TypedValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -763,11 +757,9 @@ type Path struct { func (x *Path) Reset() { *x = Path{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Path) String() string { @@ -778,7 +770,7 @@ func (*Path) ProtoMessage() {} func (x *Path) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -836,11 +828,9 @@ type PathElem struct { func (x *PathElem) Reset() { *x = PathElem{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PathElem) String() string { @@ -851,7 +841,7 @@ func (*PathElem) ProtoMessage() {} func (x *PathElem) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -896,11 +886,9 @@ type Value struct { func (x *Value) Reset() { *x = Value{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Value) String() string { @@ -911,7 +899,7 @@ func (*Value) ProtoMessage() {} func (x *Value) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -958,11 +946,9 @@ type Error struct { func (x *Error) Reset() { *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Error) String() string { @@ -973,7 +959,7 @@ func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1023,11 +1009,9 @@ type Decimal64 struct { func (x *Decimal64) Reset() { *x = Decimal64{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Decimal64) String() string { @@ -1038,7 +1022,7 @@ func (*Decimal64) ProtoMessage() {} func (x *Decimal64) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1081,11 +1065,9 @@ type ScalarArray struct { func (x *ScalarArray) Reset() { *x = ScalarArray{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ScalarArray) String() string { @@ -1096,7 +1078,7 @@ func (*ScalarArray) ProtoMessage() {} func (x *ScalarArray) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1142,11 +1124,9 @@ type SubscribeRequest struct { func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscribeRequest) String() string { @@ -1157,7 +1137,7 @@ func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1241,11 +1221,9 @@ type Poll struct { func (x *Poll) Reset() { *x = Poll{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Poll) String() string { @@ -1256,7 +1234,7 @@ func (*Poll) ProtoMessage() {} func (x *Poll) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1295,11 +1273,9 @@ type SubscribeResponse struct { func (x *SubscribeResponse) Reset() { *x = SubscribeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscribeResponse) String() string { @@ -1310,7 +1286,7 @@ func (*SubscribeResponse) ProtoMessage() {} func (x *SubscribeResponse) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1423,11 +1399,9 @@ type SubscriptionList struct { func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscriptionList) String() string { @@ -1438,7 +1412,7 @@ func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1540,11 +1514,9 @@ type Subscription struct { func (x *Subscription) Reset() { *x = Subscription{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Subscription) String() string { @@ -1555,7 +1527,7 @@ func (*Subscription) ProtoMessage() {} func (x *Subscription) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1618,11 +1590,9 @@ type QOSMarking struct { func (x *QOSMarking) Reset() { *x = QOSMarking{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *QOSMarking) String() string { @@ -1633,7 +1603,7 @@ func (*QOSMarking) ProtoMessage() {} func (x *QOSMarking) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1671,11 +1641,9 @@ type Alias struct { func (x *Alias) Reset() { *x = Alias{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Alias) String() string { @@ -1686,7 +1654,7 @@ func (*Alias) ProtoMessage() {} func (x *Alias) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1728,11 +1696,9 @@ type AliasList struct { func (x *AliasList) Reset() { *x = AliasList{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AliasList) String() string { @@ -1743,7 +1709,7 @@ func (*AliasList) ProtoMessage() {} func (x *AliasList) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1788,11 +1754,9 @@ type SetRequest struct { func (x *SetRequest) Reset() { *x = SetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetRequest) String() string { @@ -1803,7 +1767,7 @@ func (*SetRequest) ProtoMessage() {} func (x *SetRequest) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1879,11 +1843,9 @@ type SetResponse struct { func (x *SetResponse) Reset() { *x = SetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetResponse) String() string { @@ -1894,7 +1856,7 @@ func (*SetResponse) ProtoMessage() {} func (x *SetResponse) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1968,11 +1930,9 @@ type UpdateResult struct { func (x *UpdateResult) Reset() { *x = UpdateResult{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateResult) String() string { @@ -1983,7 +1943,7 @@ func (*UpdateResult) ProtoMessage() {} func (x *UpdateResult) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2051,11 +2011,9 @@ type GetRequest struct { func (x *GetRequest) Reset() { *x = GetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRequest) String() string { @@ -2066,7 +2024,7 @@ func (*GetRequest) ProtoMessage() {} func (x *GetRequest) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2142,11 +2100,9 @@ type GetResponse struct { func (x *GetResponse) Reset() { *x = GetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResponse) String() string { @@ -2157,7 +2113,7 @@ func (*GetResponse) ProtoMessage() {} func (x *GetResponse) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2209,11 +2165,9 @@ type CapabilityRequest struct { func (x *CapabilityRequest) Reset() { *x = CapabilityRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CapabilityRequest) String() string { @@ -2224,7 +2178,7 @@ func (*CapabilityRequest) ProtoMessage() {} func (x *CapabilityRequest) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2264,11 +2218,9 @@ type CapabilityResponse struct { func (x *CapabilityResponse) Reset() { *x = CapabilityResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CapabilityResponse) String() string { @@ -2279,7 +2231,7 @@ func (*CapabilityResponse) ProtoMessage() {} func (x *CapabilityResponse) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2339,11 +2291,9 @@ type ModelData struct { func (x *ModelData) Reset() { *x = ModelData{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ModelData) String() string { @@ -2354,7 +2304,7 @@ func (*ModelData) ProtoMessage() {} func (x *ModelData) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2851,308 +2801,6 @@ func file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_init() { if File_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Notification); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Update); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*TypedValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*Path); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*PathElem); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*Value); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*Decimal64); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*ScalarArray); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*SubscribeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*Poll); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*SubscribeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*SubscriptionList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*Subscription); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*QOSMarking); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*Alias); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*AliasList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*SetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*SetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*UpdateResult); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*GetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*GetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*CapabilityRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*CapabilityResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*ModelData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_msgTypes[2].OneofWrappers = []any{ (*TypedValue_StringVal)(nil), (*TypedValue_IntVal)(nil), diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go index 4a5a86104..aaaa55d00 100644 --- a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto @@ -107,11 +107,9 @@ type Extension struct { func (x *Extension) Reset() { *x = Extension{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Extension) String() string { @@ -122,7 +120,7 @@ func (*Extension) ProtoMessage() {} func (x *Extension) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -201,11 +199,9 @@ type RegisteredExtension struct { func (x *RegisteredExtension) Reset() { *x = RegisteredExtension{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RegisteredExtension) String() string { @@ -216,7 +212,7 @@ func (*RegisteredExtension) ProtoMessage() {} func (x *RegisteredExtension) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -261,11 +257,9 @@ type MasterArbitration struct { func (x *MasterArbitration) Reset() { *x = MasterArbitration{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MasterArbitration) String() string { @@ -276,7 +270,7 @@ func (*MasterArbitration) ProtoMessage() {} func (x *MasterArbitration) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -317,11 +311,9 @@ type Uint128 struct { func (x *Uint128) Reset() { *x = Uint128{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Uint128) String() string { @@ -332,7 +324,7 @@ func (*Uint128) ProtoMessage() {} func (x *Uint128) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -372,11 +364,9 @@ type Role struct { func (x *Role) Reset() { *x = Role{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Role) String() string { @@ -387,7 +377,7 @@ func (*Role) ProtoMessage() {} func (x *Role) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -426,11 +416,9 @@ type History struct { func (x *History) Reset() { *x = History{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *History) String() string { @@ -441,7 +429,7 @@ func (*History) ProtoMessage() {} func (x *History) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -504,11 +492,9 @@ type TimeRange struct { func (x *TimeRange) Reset() { *x = TimeRange{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TimeRange) String() string { @@ -519,7 +505,7 @@ func (*TimeRange) ProtoMessage() {} func (x *TimeRange) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -648,92 +634,6 @@ func file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_init() { if File_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Extension); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*RegisteredExtension); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*MasterArbitration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*Uint128); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*Role); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*History); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*TimeRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes[0].OneofWrappers = []any{ (*Extension_RegisteredExt)(nil), (*Extension_MasterArbitration)(nil), diff --git a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go index 1d8bdcf02..168a726d8 100644 --- a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/target/target.proto @@ -70,11 +70,9 @@ type Configuration struct { func (x *Configuration) Reset() { *x = Configuration{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Configuration) String() string { @@ -85,7 +83,7 @@ func (*Configuration) ProtoMessage() {} func (x *Configuration) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -148,11 +146,9 @@ type Target struct { func (x *Target) Reset() { *x = Target{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Target) String() string { @@ -163,7 +159,7 @@ func (*Target) ProtoMessage() {} func (x *Target) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -221,11 +217,9 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Credentials) String() string { @@ -236,7 +230,7 @@ func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -372,44 +366,6 @@ func file_github_com_openconfig_gnmi_proto_target_target_proto_init() { if File_github_com_openconfig_gnmi_proto_target_target_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Configuration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Target); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*Credentials); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go index 0c0a049ba..1beb87208 100644 --- a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go +++ b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: github.com/openconfig/gnmi/testing/fake/proto/fake.proto @@ -140,11 +140,9 @@ type Configuration struct { func (x *Configuration) Reset() { *x = Configuration{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Configuration) String() string { @@ -155,7 +153,7 @@ func (*Configuration) ProtoMessage() {} func (x *Configuration) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -188,11 +186,9 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Credentials) String() string { @@ -203,7 +199,7 @@ func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -287,11 +283,9 @@ type Config struct { func (x *Config) Reset() { *x = Config{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Config) String() string { @@ -302,7 +296,7 @@ func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -463,11 +457,9 @@ type FixedGenerator struct { func (x *FixedGenerator) Reset() { *x = FixedGenerator{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FixedGenerator) String() string { @@ -478,7 +470,7 @@ func (*FixedGenerator) ProtoMessage() {} func (x *FixedGenerator) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -511,11 +503,9 @@ type RandomGenerator struct { func (x *RandomGenerator) Reset() { *x = RandomGenerator{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RandomGenerator) String() string { @@ -526,7 +516,7 @@ func (*RandomGenerator) ProtoMessage() {} func (x *RandomGenerator) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -564,11 +554,9 @@ type DeleteValue struct { func (x *DeleteValue) Reset() { *x = DeleteValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteValue) String() string { @@ -579,7 +567,7 @@ func (*DeleteValue) ProtoMessage() {} func (x *DeleteValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -632,11 +620,9 @@ type Value struct { func (x *Value) Reset() { *x = Value{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Value) String() string { @@ -647,7 +633,7 @@ func (*Value) ProtoMessage() {} func (x *Value) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -824,11 +810,9 @@ type Timestamp struct { func (x *Timestamp) Reset() { *x = Timestamp{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Timestamp) String() string { @@ -839,7 +823,7 @@ func (*Timestamp) ProtoMessage() {} func (x *Timestamp) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -896,11 +880,9 @@ type IntValue struct { func (x *IntValue) Reset() { *x = IntValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *IntValue) String() string { @@ -911,7 +893,7 @@ func (*IntValue) ProtoMessage() {} func (x *IntValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -989,11 +971,9 @@ type IntRange struct { func (x *IntRange) Reset() { *x = IntRange{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *IntRange) String() string { @@ -1004,7 +984,7 @@ func (*IntRange) ProtoMessage() {} func (x *IntRange) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1061,11 +1041,9 @@ type IntList struct { func (x *IntList) Reset() { *x = IntList{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *IntList) String() string { @@ -1076,7 +1054,7 @@ func (*IntList) ProtoMessage() {} func (x *IntList) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1126,11 +1104,9 @@ type DoubleValue struct { func (x *DoubleValue) Reset() { *x = DoubleValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DoubleValue) String() string { @@ -1141,7 +1117,7 @@ func (*DoubleValue) ProtoMessage() {} func (x *DoubleValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1218,11 +1194,9 @@ type DoubleRange struct { func (x *DoubleRange) Reset() { *x = DoubleRange{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DoubleRange) String() string { @@ -1233,7 +1207,7 @@ func (*DoubleRange) ProtoMessage() {} func (x *DoubleRange) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1290,11 +1264,9 @@ type DoubleList struct { func (x *DoubleList) Reset() { *x = DoubleList{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DoubleList) String() string { @@ -1305,7 +1277,7 @@ func (*DoubleList) ProtoMessage() {} func (x *DoubleList) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1352,11 +1324,9 @@ type StringValue struct { func (x *StringValue) Reset() { *x = StringValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StringValue) String() string { @@ -1367,7 +1337,7 @@ func (*StringValue) ProtoMessage() {} func (x *StringValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1427,11 +1397,9 @@ type StringList struct { func (x *StringList) Reset() { *x = StringList{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StringList) String() string { @@ -1442,7 +1410,7 @@ func (*StringList) ProtoMessage() {} func (x *StringList) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1489,11 +1457,9 @@ type StringListValue struct { func (x *StringListValue) Reset() { *x = StringListValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StringListValue) String() string { @@ -1504,7 +1470,7 @@ func (*StringListValue) ProtoMessage() {} func (x *StringListValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1568,11 +1534,9 @@ type BoolValue struct { func (x *BoolValue) Reset() { *x = BoolValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *BoolValue) String() string { @@ -1583,7 +1547,7 @@ func (*BoolValue) ProtoMessage() {} func (x *BoolValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1643,11 +1607,9 @@ type BoolList struct { func (x *BoolList) Reset() { *x = BoolList{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *BoolList) String() string { @@ -1658,7 +1620,7 @@ func (*BoolList) ProtoMessage() {} func (x *BoolList) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1708,11 +1670,9 @@ type UintValue struct { func (x *UintValue) Reset() { *x = UintValue{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UintValue) String() string { @@ -1723,7 +1683,7 @@ func (*UintValue) ProtoMessage() {} func (x *UintValue) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1801,11 +1761,9 @@ type UintRange struct { func (x *UintRange) Reset() { *x = UintRange{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UintRange) String() string { @@ -1816,7 +1774,7 @@ func (*UintRange) ProtoMessage() {} func (x *UintRange) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1873,11 +1831,9 @@ type UintList struct { func (x *UintList) Reset() { *x = UintList{} - if protoimpl.UnsafeEnabled { - mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UintList) String() string { @@ -1888,7 +1844,7 @@ func (*UintList) ProtoMessage() {} func (x *UintList) ProtoReflect() protoreflect.Message { mi := &file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2225,272 +2181,6 @@ func file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_init() { if File_github_com_openconfig_gnmi_testing_fake_proto_fake_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Configuration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Credentials); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*Config); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*FixedGenerator); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*RandomGenerator); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*DeleteValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*Value); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*Timestamp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*IntValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*IntRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*IntList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*DoubleValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*DoubleRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*DoubleList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*StringValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*StringList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*StringListValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*BoolValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*BoolList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*UintValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*UintRange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*UintList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes[2].OneofWrappers = []any{ (*Config_Custom)(nil), (*Config_Random)(nil), diff --git a/api/go/gosdn/app/app.pb.go b/api/go/gosdn/app/app.pb.go index 30ffd0da2..8064592bd 100644 --- a/api/go/gosdn/app/app.pb.go +++ b/api/go/gosdn/app/app.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/app/app.proto @@ -36,11 +36,9 @@ type AppRegisterRequest struct { func (x *AppRegisterRequest) Reset() { *x = AppRegisterRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_app_app_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_app_app_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AppRegisterRequest) String() string { @@ -51,7 +49,7 @@ func (*AppRegisterRequest) ProtoMessage() {} func (x *AppRegisterRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_app_app_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -98,11 +96,9 @@ type AppRegisterResponse struct { func (x *AppRegisterResponse) Reset() { *x = AppRegisterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_app_app_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_app_app_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AppRegisterResponse) String() string { @@ -113,7 +109,7 @@ func (*AppRegisterResponse) ProtoMessage() {} func (x *AppRegisterResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_app_app_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -153,11 +149,9 @@ type AppDeregisterRequest struct { func (x *AppDeregisterRequest) Reset() { *x = AppDeregisterRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_app_app_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_app_app_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AppDeregisterRequest) String() string { @@ -168,7 +162,7 @@ func (*AppDeregisterRequest) ProtoMessage() {} func (x *AppDeregisterRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_app_app_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -207,11 +201,9 @@ type AppDeregisterResponse struct { func (x *AppDeregisterResponse) Reset() { *x = AppDeregisterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_app_app_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_app_app_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AppDeregisterResponse) String() string { @@ -222,7 +214,7 @@ func (*AppDeregisterResponse) ProtoMessage() {} func (x *AppDeregisterResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_app_app_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -336,56 +328,6 @@ func file_gosdn_app_app_proto_init() { if File_gosdn_app_app_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_app_app_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*AppRegisterRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_app_app_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*AppRegisterResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_app_app_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*AppDeregisterRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_app_app_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*AppDeregisterResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go index c999d4db4..b4600ce3f 100644 --- a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go +++ b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/configurationmanagement/configurationmanagement.proto @@ -34,11 +34,9 @@ type ExportSDNConfigRequest struct { func (x *ExportSDNConfigRequest) Reset() { *x = ExportSDNConfigRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportSDNConfigRequest) String() string { @@ -49,7 +47,7 @@ func (*ExportSDNConfigRequest) ProtoMessage() {} func (x *ExportSDNConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -89,11 +87,9 @@ type ExportSDNConfigResponse struct { func (x *ExportSDNConfigResponse) Reset() { *x = ExportSDNConfigResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportSDNConfigResponse) String() string { @@ -104,7 +100,7 @@ func (*ExportSDNConfigResponse) ProtoMessage() {} func (x *ExportSDNConfigResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -145,11 +141,9 @@ type ImportSDNConfigRequest struct { func (x *ImportSDNConfigRequest) Reset() { *x = ImportSDNConfigRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImportSDNConfigRequest) String() string { @@ -160,7 +154,7 @@ func (*ImportSDNConfigRequest) ProtoMessage() {} func (x *ImportSDNConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -206,11 +200,9 @@ type ImportSDNConfigResponse struct { func (x *ImportSDNConfigResponse) Reset() { *x = ImportSDNConfigResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImportSDNConfigResponse) String() string { @@ -221,7 +213,7 @@ func (*ImportSDNConfigResponse) ProtoMessage() {} func (x *ImportSDNConfigResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -343,56 +335,6 @@ func file_gosdn_configurationmanagement_configurationmanagement_proto_init() { if File_gosdn_configurationmanagement_configurationmanagement_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*ExportSDNConfigRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*ExportSDNConfigResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*ImportSDNConfigRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*ImportSDNConfigResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/conflict/conflict.pb.go b/api/go/gosdn/conflict/conflict.pb.go index b43d09bf5..a1c9d5c44 100644 --- a/api/go/gosdn/conflict/conflict.pb.go +++ b/api/go/gosdn/conflict/conflict.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/conflict/conflict.proto @@ -31,11 +31,9 @@ type Metadata struct { func (x *Metadata) Reset() { *x = Metadata{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_conflict_conflict_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_conflict_conflict_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata) String() string { @@ -46,7 +44,7 @@ func (*Metadata) ProtoMessage() {} func (x *Metadata) ProtoReflect() protoreflect.Message { mi := &file_gosdn_conflict_conflict_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -115,20 +113,6 @@ func file_gosdn_conflict_conflict_proto_init() { if File_gosdn_conflict_conflict_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_conflict_conflict_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Metadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/csbi/csbi.pb.go b/api/go/gosdn/csbi/csbi.pb.go index 6fd657bc9..55f5c6d63 100644 --- a/api/go/gosdn/csbi/csbi.pb.go +++ b/api/go/gosdn/csbi/csbi.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/csbi/csbi.proto @@ -92,11 +92,9 @@ type Syn struct { func (x *Syn) Reset() { *x = Syn{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Syn) String() string { @@ -107,7 +105,7 @@ func (*Syn) ProtoMessage() {} func (x *Syn) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -154,11 +152,9 @@ type Ack struct { func (x *Ack) Reset() { *x = Ack{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Ack) String() string { @@ -169,7 +165,7 @@ func (*Ack) ProtoMessage() {} func (x *Ack) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -210,11 +206,9 @@ type GetRequest struct { func (x *GetRequest) Reset() { *x = GetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRequest) String() string { @@ -225,7 +219,7 @@ func (*GetRequest) ProtoMessage() {} func (x *GetRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -273,11 +267,9 @@ type GetPayloadRequest struct { func (x *GetPayloadRequest) Reset() { *x = GetPayloadRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPayloadRequest) String() string { @@ -288,7 +280,7 @@ func (*GetPayloadRequest) ProtoMessage() {} func (x *GetPayloadRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -335,11 +327,9 @@ type GetResponse struct { func (x *GetResponse) Reset() { *x = GetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResponse) String() string { @@ -350,7 +340,7 @@ func (*GetResponse) ProtoMessage() {} func (x *GetResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -391,11 +381,9 @@ type Deployment struct { func (x *Deployment) Reset() { *x = Deployment{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Deployment) String() string { @@ -406,7 +394,7 @@ func (*Deployment) ProtoMessage() {} func (x *Deployment) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -453,11 +441,9 @@ type CreateRequest struct { func (x *CreateRequest) Reset() { *x = CreateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateRequest) String() string { @@ -468,7 +454,7 @@ func (*CreateRequest) ProtoMessage() {} func (x *CreateRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -508,11 +494,9 @@ type CreateResponse struct { func (x *CreateResponse) Reset() { *x = CreateResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateResponse) String() string { @@ -523,7 +507,7 @@ func (*CreateResponse) ProtoMessage() {} func (x *CreateResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -562,11 +546,9 @@ type Payload struct { func (x *Payload) Reset() { *x = Payload{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Payload) String() string { @@ -577,7 +559,7 @@ func (*Payload) ProtoMessage() {} func (x *Payload) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -610,11 +592,9 @@ type DeleteRequest struct { func (x *DeleteRequest) Reset() { *x = DeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRequest) String() string { @@ -625,7 +605,7 @@ func (*DeleteRequest) ProtoMessage() {} func (x *DeleteRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -664,11 +644,9 @@ type DeleteResponse struct { func (x *DeleteResponse) Reset() { *x = DeleteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_csbi_csbi_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_csbi_csbi_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteResponse) String() string { @@ -679,7 +657,7 @@ func (*DeleteResponse) ProtoMessage() {} func (x *DeleteResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_csbi_csbi_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -869,140 +847,6 @@ func file_gosdn_csbi_csbi_proto_init() { if File_gosdn_csbi_csbi_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_csbi_csbi_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Syn); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Ack); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*GetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetPayloadRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*Deployment); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*CreateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*CreateResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*Payload); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_csbi_csbi_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*DeleteResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/networkelement/networkelement.pb.go b/api/go/gosdn/networkelement/networkelement.pb.go index 6ed237be7..a58431fdb 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.go +++ b/api/go/gosdn/networkelement/networkelement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/networkelement/networkelement.proto @@ -303,11 +303,9 @@ type UpdateNetworkElementRequest struct { func (x *UpdateNetworkElementRequest) Reset() { *x = UpdateNetworkElementRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateNetworkElementRequest) String() string { @@ -318,7 +316,7 @@ func (*UpdateNetworkElementRequest) ProtoMessage() {} func (x *UpdateNetworkElementRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -357,11 +355,9 @@ type UpdateNetworkElementResponse struct { func (x *UpdateNetworkElementResponse) Reset() { *x = UpdateNetworkElementResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateNetworkElementResponse) String() string { @@ -372,7 +368,7 @@ func (*UpdateNetworkElementResponse) ProtoMessage() {} func (x *UpdateNetworkElementResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -413,11 +409,9 @@ type ManagedNetworkElement struct { func (x *ManagedNetworkElement) Reset() { *x = ManagedNetworkElement{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ManagedNetworkElement) String() string { @@ -428,7 +422,7 @@ func (*ManagedNetworkElement) ProtoMessage() {} func (x *ManagedNetworkElement) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -526,11 +520,9 @@ type FlattenedManagedNetworkElement struct { func (x *FlattenedManagedNetworkElement) Reset() { *x = FlattenedManagedNetworkElement{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FlattenedManagedNetworkElement) String() string { @@ -541,7 +533,7 @@ func (*FlattenedManagedNetworkElement) ProtoMessage() {} func (x *FlattenedManagedNetworkElement) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -595,11 +587,9 @@ type GetAllRequest struct { func (x *GetAllRequest) Reset() { *x = GetAllRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAllRequest) String() string { @@ -610,7 +600,7 @@ func (*GetAllRequest) ProtoMessage() {} func (x *GetAllRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -653,11 +643,9 @@ type GetAllResponse struct { func (x *GetAllResponse) Reset() { *x = GetAllResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAllResponse) String() string { @@ -668,7 +656,7 @@ func (*GetAllResponse) ProtoMessage() {} func (x *GetAllResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -715,11 +703,9 @@ type GetAllFlattenedRequest struct { func (x *GetAllFlattenedRequest) Reset() { *x = GetAllFlattenedRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAllFlattenedRequest) String() string { @@ -730,7 +716,7 @@ func (*GetAllFlattenedRequest) ProtoMessage() {} func (x *GetAllFlattenedRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -773,11 +759,9 @@ type GetAllFlattenedResponse struct { func (x *GetAllFlattenedResponse) Reset() { *x = GetAllFlattenedResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAllFlattenedResponse) String() string { @@ -788,7 +772,7 @@ func (*GetAllFlattenedResponse) ProtoMessage() {} func (x *GetAllFlattenedResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -824,6 +808,112 @@ func (x *GetAllFlattenedResponse) GetMne() []*FlattenedManagedNetworkElement { return nil } +type ParseYangRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Yang string `protobuf:"bytes,2,opt,name=yang,proto3" json:"yang,omitempty"` +} + +func (x *ParseYangRequest) Reset() { + *x = ParseYangRequest{} + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ParseYangRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParseYangRequest) ProtoMessage() {} + +func (x *ParseYangRequest) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParseYangRequest.ProtoReflect.Descriptor instead. +func (*ParseYangRequest) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{8} +} + +func (x *ParseYangRequest) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *ParseYangRequest) GetYang() string { + if x != nil { + return x.Yang + } + return "" +} + +type ParseYangResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Json string `protobuf:"bytes,2,opt,name=json,proto3" json:"json,omitempty"` +} + +func (x *ParseYangResponse) Reset() { + *x = ParseYangResponse{} + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ParseYangResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParseYangResponse) ProtoMessage() {} + +func (x *ParseYangResponse) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParseYangResponse.ProtoReflect.Descriptor instead. +func (*ParseYangResponse) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{9} +} + +func (x *ParseYangResponse) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *ParseYangResponse) GetJson() string { + if x != nil { + return x.Json + } + return "" +} + type GetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -836,11 +926,9 @@ type GetRequest struct { func (x *GetRequest) Reset() { *x = GetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRequest) String() string { @@ -850,8 +938,8 @@ func (x *GetRequest) String() string { func (*GetRequest) ProtoMessage() {} func (x *GetRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -863,7 +951,7 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRequest.ProtoReflect.Descriptor instead. func (*GetRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{8} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{10} } func (x *GetRequest) GetTimestamp() int64 { @@ -901,11 +989,9 @@ type GetResponse struct { func (x *GetResponse) Reset() { *x = GetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResponse) String() string { @@ -915,8 +1001,8 @@ func (x *GetResponse) String() string { func (*GetResponse) ProtoMessage() {} func (x *GetResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -928,7 +1014,7 @@ func (x *GetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetResponse.ProtoReflect.Descriptor instead. func (*GetResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{9} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{11} } func (x *GetResponse) GetTimestamp() int64 { @@ -964,11 +1050,9 @@ type GetFlattenedRequest struct { func (x *GetFlattenedRequest) Reset() { *x = GetFlattenedRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetFlattenedRequest) String() string { @@ -978,8 +1062,8 @@ func (x *GetFlattenedRequest) String() string { func (*GetFlattenedRequest) ProtoMessage() {} func (x *GetFlattenedRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -991,7 +1075,7 @@ func (x *GetFlattenedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFlattenedRequest.ProtoReflect.Descriptor instead. func (*GetFlattenedRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{10} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{12} } func (x *GetFlattenedRequest) GetTimestamp() int64 { @@ -1029,11 +1113,9 @@ type GetFlattenedResponse struct { func (x *GetFlattenedResponse) Reset() { *x = GetFlattenedResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetFlattenedResponse) String() string { @@ -1043,8 +1125,8 @@ func (x *GetFlattenedResponse) String() string { func (*GetFlattenedResponse) ProtoMessage() {} func (x *GetFlattenedResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1056,7 +1138,7 @@ func (x *GetFlattenedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFlattenedResponse.ProtoReflect.Descriptor instead. func (*GetFlattenedResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{11} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{13} } func (x *GetFlattenedResponse) GetTimestamp() int64 { @@ -1096,11 +1178,9 @@ type SetMne struct { func (x *SetMne) Reset() { *x = SetMne{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetMne) String() string { @@ -1110,8 +1190,8 @@ func (x *SetMne) String() string { func (*SetMne) ProtoMessage() {} func (x *SetMne) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1123,7 +1203,7 @@ func (x *SetMne) ProtoReflect() protoreflect.Message { // Deprecated: Use SetMne.ProtoReflect.Descriptor instead. func (*SetMne) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{12} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{14} } func (x *SetMne) GetAddress() string { @@ -1187,11 +1267,9 @@ type AddListRequest struct { func (x *AddListRequest) Reset() { *x = AddListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddListRequest) String() string { @@ -1201,8 +1279,8 @@ func (x *AddListRequest) String() string { func (*AddListRequest) ProtoMessage() {} func (x *AddListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1214,7 +1292,7 @@ func (x *AddListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddListRequest.ProtoReflect.Descriptor instead. func (*AddListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{13} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{15} } func (x *AddListRequest) GetTimestamp() int64 { @@ -1249,11 +1327,9 @@ type AddListResponse struct { func (x *AddListResponse) Reset() { *x = AddListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddListResponse) String() string { @@ -1263,8 +1339,8 @@ func (x *AddListResponse) String() string { func (*AddListResponse) ProtoMessage() {} func (x *AddListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1276,7 +1352,7 @@ func (x *AddListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddListResponse.ProtoReflect.Descriptor instead. func (*AddListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{14} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{16} } func (x *AddListResponse) GetTimestamp() int64 { @@ -1306,11 +1382,9 @@ type GetPathRequest struct { func (x *GetPathRequest) Reset() { *x = GetPathRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPathRequest) String() string { @@ -1320,8 +1394,8 @@ func (x *GetPathRequest) String() string { func (*GetPathRequest) ProtoMessage() {} func (x *GetPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1333,7 +1407,7 @@ func (x *GetPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPathRequest.ProtoReflect.Descriptor instead. func (*GetPathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{15} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{17} } func (x *GetPathRequest) GetTimestamp() int64 { @@ -1378,11 +1452,9 @@ type GetPathResponse struct { func (x *GetPathResponse) Reset() { *x = GetPathResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPathResponse) String() string { @@ -1392,8 +1464,8 @@ func (x *GetPathResponse) String() string { func (*GetPathResponse) ProtoMessage() {} func (x *GetPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1405,7 +1477,7 @@ func (x *GetPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPathResponse.ProtoReflect.Descriptor instead. func (*GetPathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{16} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{18} } func (x *GetPathResponse) GetTimestamp() int64 { @@ -1442,11 +1514,9 @@ type GetIntendedPathRequest struct { func (x *GetIntendedPathRequest) Reset() { *x = GetIntendedPathRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetIntendedPathRequest) String() string { @@ -1456,8 +1526,8 @@ func (x *GetIntendedPathRequest) String() string { func (*GetIntendedPathRequest) ProtoMessage() {} func (x *GetIntendedPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1469,7 +1539,7 @@ func (x *GetIntendedPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetIntendedPathRequest.ProtoReflect.Descriptor instead. func (*GetIntendedPathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{17} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{19} } func (x *GetIntendedPathRequest) GetTimestamp() int64 { @@ -1512,11 +1582,9 @@ type GetIntendedPathResponse struct { func (x *GetIntendedPathResponse) Reset() { *x = GetIntendedPathResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetIntendedPathResponse) String() string { @@ -1526,8 +1594,8 @@ func (x *GetIntendedPathResponse) String() string { func (*GetIntendedPathResponse) ProtoMessage() {} func (x *GetIntendedPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1539,7 +1607,7 @@ func (x *GetIntendedPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetIntendedPathResponse.ProtoReflect.Descriptor instead. func (*GetIntendedPathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{18} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{20} } func (x *GetIntendedPathResponse) GetTimestamp() int64 { @@ -1574,11 +1642,9 @@ type SetResponse struct { func (x *SetResponse) Reset() { *x = SetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetResponse) String() string { @@ -1588,8 +1654,8 @@ func (x *SetResponse) String() string { func (*SetResponse) ProtoMessage() {} func (x *SetResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1601,7 +1667,7 @@ func (x *SetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetResponse.ProtoReflect.Descriptor instead. func (*SetResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{19} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{21} } func (x *SetResponse) GetTimestamp() int64 { @@ -1630,11 +1696,9 @@ type SetPathListRequest struct { func (x *SetPathListRequest) Reset() { *x = SetPathListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetPathListRequest) String() string { @@ -1644,8 +1708,8 @@ func (x *SetPathListRequest) String() string { func (*SetPathListRequest) ProtoMessage() {} func (x *SetPathListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1657,7 +1721,7 @@ func (x *SetPathListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPathListRequest.ProtoReflect.Descriptor instead. func (*SetPathListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{20} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{22} } func (x *SetPathListRequest) GetTimestamp() int64 { @@ -1692,11 +1756,9 @@ type SetPathListResponse struct { func (x *SetPathListResponse) Reset() { *x = SetPathListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetPathListResponse) String() string { @@ -1706,8 +1768,8 @@ func (x *SetPathListResponse) String() string { func (*SetPathListResponse) ProtoMessage() {} func (x *SetPathListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1719,7 +1781,7 @@ func (x *SetPathListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPathListResponse.ProtoReflect.Descriptor instead. func (*SetPathListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{21} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{23} } func (x *SetPathListResponse) GetTimestamp() int64 { @@ -1748,11 +1810,9 @@ type DeleteRequest struct { func (x *DeleteRequest) Reset() { *x = DeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRequest) String() string { @@ -1762,8 +1822,8 @@ func (x *DeleteRequest) String() string { func (*DeleteRequest) ProtoMessage() {} func (x *DeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1775,7 +1835,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead. func (*DeleteRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{22} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{24} } func (x *DeleteRequest) GetTimestamp() int64 { @@ -1809,11 +1869,9 @@ type DeleteResponse struct { func (x *DeleteResponse) Reset() { *x = DeleteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteResponse) String() string { @@ -1823,8 +1881,8 @@ func (x *DeleteResponse) String() string { func (*DeleteResponse) ProtoMessage() {} func (x *DeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1836,7 +1894,7 @@ func (x *DeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead. func (*DeleteResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{23} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{25} } func (x *DeleteResponse) GetTimestamp() int64 { @@ -1859,11 +1917,9 @@ type Change struct { func (x *Change) Reset() { *x = Change{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Change) String() string { @@ -1873,8 +1929,8 @@ func (x *Change) String() string { func (*Change) ProtoMessage() {} func (x *Change) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1886,7 +1942,7 @@ func (x *Change) ProtoReflect() protoreflect.Message { // Deprecated: Use Change.ProtoReflect.Descriptor instead. func (*Change) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{24} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{26} } func (x *Change) GetId() string { @@ -1930,11 +1986,9 @@ type ChangeRequest struct { func (x *ChangeRequest) Reset() { *x = ChangeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChangeRequest) String() string { @@ -1944,8 +1998,8 @@ func (x *ChangeRequest) String() string { func (*ChangeRequest) ProtoMessage() {} func (x *ChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1957,7 +2011,7 @@ func (x *ChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRequest.ProtoReflect.Descriptor instead. func (*ChangeRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{25} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{27} } func (x *ChangeRequest) GetMneid() string { @@ -1999,11 +2053,9 @@ type SetChange struct { func (x *SetChange) Reset() { *x = SetChange{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetChange) String() string { @@ -2013,8 +2065,8 @@ func (x *SetChange) String() string { func (*SetChange) ProtoMessage() {} func (x *SetChange) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2026,7 +2078,7 @@ func (x *SetChange) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChange.ProtoReflect.Descriptor instead. func (*SetChange) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{26} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{28} } func (x *SetChange) GetCuid() string { @@ -2054,11 +2106,9 @@ type GetChangeListRequest struct { func (x *GetChangeListRequest) Reset() { *x = GetChangeListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetChangeListRequest) String() string { @@ -2068,8 +2118,8 @@ func (x *GetChangeListRequest) String() string { func (*GetChangeListRequest) ProtoMessage() {} func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2081,7 +2131,7 @@ func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeListRequest.ProtoReflect.Descriptor instead. func (*GetChangeListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{27} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{29} } func (x *GetChangeListRequest) GetTimestamp() int64 { @@ -2112,11 +2162,9 @@ type GetChangeListResponse struct { func (x *GetChangeListResponse) Reset() { *x = GetChangeListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetChangeListResponse) String() string { @@ -2126,8 +2174,8 @@ func (x *GetChangeListResponse) String() string { func (*GetChangeListResponse) ProtoMessage() {} func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2139,7 +2187,7 @@ func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeListResponse.ProtoReflect.Descriptor instead. func (*GetChangeListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{28} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{30} } func (x *GetChangeListResponse) GetTimestamp() int64 { @@ -2175,11 +2223,9 @@ type GetChangeRequest struct { func (x *GetChangeRequest) Reset() { *x = GetChangeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetChangeRequest) String() string { @@ -2189,8 +2235,8 @@ func (x *GetChangeRequest) String() string { func (*GetChangeRequest) ProtoMessage() {} func (x *GetChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2202,7 +2248,7 @@ func (x *GetChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeRequest.ProtoReflect.Descriptor instead. func (*GetChangeRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{29} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{31} } func (x *GetChangeRequest) GetTimestamp() int64 { @@ -2240,11 +2286,9 @@ type GetChangeResponse struct { func (x *GetChangeResponse) Reset() { *x = GetChangeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetChangeResponse) String() string { @@ -2254,8 +2298,8 @@ func (x *GetChangeResponse) String() string { func (*GetChangeResponse) ProtoMessage() {} func (x *GetChangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2267,7 +2311,7 @@ func (x *GetChangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeResponse.ProtoReflect.Descriptor instead. func (*GetChangeResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{30} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{32} } func (x *GetChangeResponse) GetTimestamp() int64 { @@ -2303,11 +2347,9 @@ type SetChangeListRequest struct { func (x *SetChangeListRequest) Reset() { *x = SetChangeListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetChangeListRequest) String() string { @@ -2317,8 +2359,8 @@ func (x *SetChangeListRequest) String() string { func (*SetChangeListRequest) ProtoMessage() {} func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2330,7 +2372,7 @@ func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChangeListRequest.ProtoReflect.Descriptor instead. func (*SetChangeListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{31} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{33} } func (x *SetChangeListRequest) GetTimestamp() int64 { @@ -2365,11 +2407,9 @@ type SetChangeListResponse struct { func (x *SetChangeListResponse) Reset() { *x = SetChangeListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetChangeListResponse) String() string { @@ -2379,8 +2419,8 @@ func (x *SetChangeListResponse) String() string { func (*SetChangeListResponse) ProtoMessage() {} func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2392,7 +2432,7 @@ func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChangeListResponse.ProtoReflect.Descriptor instead. func (*SetChangeListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{32} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{34} } func (x *SetChangeListResponse) GetTimestamp() int64 { @@ -2422,11 +2462,9 @@ type SubscriptionList struct { func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscriptionList) String() string { @@ -2436,8 +2474,8 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2449,7 +2487,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{33} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{35} } func (x *SubscriptionList) GetSubscription() []*Subscription { @@ -2478,11 +2516,9 @@ type Subscription struct { func (x *Subscription) Reset() { *x = Subscription{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Subscription) String() string { @@ -2492,8 +2528,8 @@ func (x *Subscription) String() string { func (*Subscription) ProtoMessage() {} func (x *Subscription) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2505,7 +2541,7 @@ func (x *Subscription) ProtoReflect() protoreflect.Message { // Deprecated: Use Subscription.ProtoReflect.Descriptor instead. func (*Subscription) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{34} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{36} } func (x *Subscription) GetPath() string { @@ -2542,11 +2578,9 @@ type SubscribePathRequest struct { func (x *SubscribePathRequest) Reset() { *x = SubscribePathRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscribePathRequest) String() string { @@ -2556,8 +2590,8 @@ func (x *SubscribePathRequest) String() string { func (*SubscribePathRequest) ProtoMessage() {} func (x *SubscribePathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[37] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2569,7 +2603,7 @@ func (x *SubscribePathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribePathRequest.ProtoReflect.Descriptor instead. func (*SubscribePathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{35} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{37} } func (x *SubscribePathRequest) GetTimestamp() int64 { @@ -2611,11 +2645,9 @@ type SubscribePathResponse struct { func (x *SubscribePathResponse) Reset() { *x = SubscribePathResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscribePathResponse) String() string { @@ -2625,8 +2657,8 @@ func (x *SubscribePathResponse) String() string { func (*SubscribePathResponse) ProtoMessage() {} func (x *SubscribePathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[38] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2638,7 +2670,7 @@ func (x *SubscribePathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribePathResponse.ProtoReflect.Descriptor instead. func (*SubscribePathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{36} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{38} } func (x *SubscribePathResponse) GetTimestamp() int64 { @@ -2762,326 +2794,343 @@ var file_gosdn_networkelement_networkelement_proto_rawDesc = []byte{ 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, - 0x6e, 0x65, 0x22, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, - 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, - 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, - 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x6e, 0x65, 0x22, 0x4c, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x6b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, - 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, - 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xb1, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, - 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, - 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, - 0x64, 0x12, 0x46, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x06, 0x53, 0x65, - 0x74, 0x4d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x12, 0x67, 0x6e, 0x6d, 0x69, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x6e, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x80, 0x01, - 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, - 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x22, 0x70, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x04, 0x79, 0x61, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x79, 0x61, 0x6e, 0x67, + 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, + 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, + 0x70, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, - 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, - 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, - 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x6b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, + 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, + 0x69, 0x64, 0x22, 0xb1, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, - 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, - 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, - 0x6e, 0x65, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x17, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x40, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, - 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, - 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x46, + 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x4d, 0x6e, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6e, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6e, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x12, 0x67, 0x6e, 0x6d, 0x69, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x0e, 0x41, + 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0e, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x13, 0x53, 0x65, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x03, 0x6d, + 0x6e, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, + 0x6d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x70, 0x0a, + 0x0f, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, - 0x5d, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x22, 0x2e, - 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, - 0x01, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0xa8, 0x01, 0x0a, - 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, - 0x6e, 0x65, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x06, - 0x61, 0x70, 0x69, 0x5f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x05, 0x61, 0x70, 0x69, 0x4f, 0x70, 0x22, 0x50, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x4e, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x66, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, - 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x03, 0x70, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, - 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, - 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x76, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0xa8, 0x01, - 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xba, 0x48, - 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, - 0x01, 0x01, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x82, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x1a, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, + 0x03, 0x70, 0x69, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, + 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, + 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, + 0x64, 0x12, 0x2b, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x40, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, + 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1c, 0x0a, + 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x01, 0x0a, 0x06, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0xa8, 0x01, 0x0a, 0x0d, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, + 0x6e, 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, + 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x61, 0x70, 0x69, + 0x5f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x74, 0x22, 0x74, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, - 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x61, + 0x70, 0x69, 0x4f, 0x70, 0x22, 0x50, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x4e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, + 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, + 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x66, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x04, 0x63, + 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, + 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x22, 0x8f, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, + 0x69, 0x64, 0x22, 0x76, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, - 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, - 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, - 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e, 0x53, 0x49, - 0x53, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49, 0x5f, 0x4f, - 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, - 0x12, 0x19, 0x0a, 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x41, - 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, - 0x45, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, - 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, - 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x50, 0x45, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x03, - 0x2a, 0x8b, 0x01, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, - 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, - 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, - 0x43, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, - 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x10, 0x03, 0x2a, 0x7c, - 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, - 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, - 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, - 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x52, - 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, - 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x03, 0x32, 0xaf, 0x0d, 0x0a, - 0x15, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x10, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x50, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, + 0x02, 0x08, 0x01, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x42, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, + 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, + 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x06, + 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x74, 0x22, + 0x74, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1a, 0x0a, + 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, + 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, + 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, + 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, + 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x19, 0x0a, + 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, + 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, + 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, + 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, + 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, + 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, + 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x03, 0x2a, 0x8b, 0x01, + 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, + 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x43, 0x45, 0x10, + 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x02, 0x12, + 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x10, 0x03, 0x2a, 0x7c, 0x0a, 0x0a, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, + 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x46, + 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, + 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, + 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, + 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x03, 0x32, 0xa2, 0x0e, 0x0a, 0x15, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x31, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, - 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x53, 0x0a, 0x06, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, + 0x22, 0x17, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x53, 0x0a, 0x06, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, + 0x64, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, + 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x12, 0x61, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x7d, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x6c, 0x61, 0x74, 0x74, - 0x65, 0x6e, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x6d, 0x6e, 0x65, 0x73, - 0x12, 0x61, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, - 0x69, 0x64, 0x7d, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0f, 0x12, 0x0d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x7d, + 0x12, 0x71, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x12, 0x26, 0x2e, + 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x79, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, @@ -3178,7 +3227,7 @@ func file_gosdn_networkelement_networkelement_proto_rawDescGZIP() []byte { } var file_gosdn_networkelement_networkelement_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_gosdn_networkelement_networkelement_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_gosdn_networkelement_networkelement_proto_msgTypes = make([]protoimpl.MessageInfo, 39) var file_gosdn_networkelement_networkelement_proto_goTypes = []any{ (ChangeState)(0), // 0: gosdn.networkelement.ChangeState (ApiOperation)(0), // 1: gosdn.networkelement.ApiOperation @@ -3193,113 +3242,117 @@ var file_gosdn_networkelement_networkelement_proto_goTypes = []any{ (*GetAllResponse)(nil), // 10: gosdn.networkelement.GetAllResponse (*GetAllFlattenedRequest)(nil), // 11: gosdn.networkelement.GetAllFlattenedRequest (*GetAllFlattenedResponse)(nil), // 12: gosdn.networkelement.GetAllFlattenedResponse - (*GetRequest)(nil), // 13: gosdn.networkelement.GetRequest - (*GetResponse)(nil), // 14: gosdn.networkelement.GetResponse - (*GetFlattenedRequest)(nil), // 15: gosdn.networkelement.GetFlattenedRequest - (*GetFlattenedResponse)(nil), // 16: gosdn.networkelement.GetFlattenedResponse - (*SetMne)(nil), // 17: gosdn.networkelement.SetMne - (*AddListRequest)(nil), // 18: gosdn.networkelement.AddListRequest - (*AddListResponse)(nil), // 19: gosdn.networkelement.AddListResponse - (*GetPathRequest)(nil), // 20: gosdn.networkelement.GetPathRequest - (*GetPathResponse)(nil), // 21: gosdn.networkelement.GetPathResponse - (*GetIntendedPathRequest)(nil), // 22: gosdn.networkelement.GetIntendedPathRequest - (*GetIntendedPathResponse)(nil), // 23: gosdn.networkelement.GetIntendedPathResponse - (*SetResponse)(nil), // 24: gosdn.networkelement.SetResponse - (*SetPathListRequest)(nil), // 25: gosdn.networkelement.SetPathListRequest - (*SetPathListResponse)(nil), // 26: gosdn.networkelement.SetPathListResponse - (*DeleteRequest)(nil), // 27: gosdn.networkelement.DeleteRequest - (*DeleteResponse)(nil), // 28: gosdn.networkelement.DeleteResponse - (*Change)(nil), // 29: gosdn.networkelement.Change - (*ChangeRequest)(nil), // 30: gosdn.networkelement.ChangeRequest - (*SetChange)(nil), // 31: gosdn.networkelement.SetChange - (*GetChangeListRequest)(nil), // 32: gosdn.networkelement.GetChangeListRequest - (*GetChangeListResponse)(nil), // 33: gosdn.networkelement.GetChangeListResponse - (*GetChangeRequest)(nil), // 34: gosdn.networkelement.GetChangeRequest - (*GetChangeResponse)(nil), // 35: gosdn.networkelement.GetChangeResponse - (*SetChangeListRequest)(nil), // 36: gosdn.networkelement.SetChangeListRequest - (*SetChangeListResponse)(nil), // 37: gosdn.networkelement.SetChangeListResponse - (*SubscriptionList)(nil), // 38: gosdn.networkelement.SubscriptionList - (*Subscription)(nil), // 39: gosdn.networkelement.Subscription - (*SubscribePathRequest)(nil), // 40: gosdn.networkelement.SubscribePathRequest - (*SubscribePathResponse)(nil), // 41: gosdn.networkelement.SubscribePathResponse - (*plugin_registry.Plugin)(nil), // 42: gosdn.plugin_registry.Plugin - (*gnmi.Notification)(nil), // 43: gnmi.Notification - (*transport.TransportOption)(nil), // 44: gosdn.transport.TransportOption - (*conflict.Metadata)(nil), // 45: gosdn.conflict.Metadata - (*pnd.PrincipalNetworkDomain)(nil), // 46: gosdn.pnd.PrincipalNetworkDomain - (*gnmi.Path)(nil), // 47: gnmi.Path - (*gnmi.TypedValue)(nil), // 48: gnmi.TypedValue + (*ParseYangRequest)(nil), // 13: gosdn.networkelement.ParseYangRequest + (*ParseYangResponse)(nil), // 14: gosdn.networkelement.ParseYangResponse + (*GetRequest)(nil), // 15: gosdn.networkelement.GetRequest + (*GetResponse)(nil), // 16: gosdn.networkelement.GetResponse + (*GetFlattenedRequest)(nil), // 17: gosdn.networkelement.GetFlattenedRequest + (*GetFlattenedResponse)(nil), // 18: gosdn.networkelement.GetFlattenedResponse + (*SetMne)(nil), // 19: gosdn.networkelement.SetMne + (*AddListRequest)(nil), // 20: gosdn.networkelement.AddListRequest + (*AddListResponse)(nil), // 21: gosdn.networkelement.AddListResponse + (*GetPathRequest)(nil), // 22: gosdn.networkelement.GetPathRequest + (*GetPathResponse)(nil), // 23: gosdn.networkelement.GetPathResponse + (*GetIntendedPathRequest)(nil), // 24: gosdn.networkelement.GetIntendedPathRequest + (*GetIntendedPathResponse)(nil), // 25: gosdn.networkelement.GetIntendedPathResponse + (*SetResponse)(nil), // 26: gosdn.networkelement.SetResponse + (*SetPathListRequest)(nil), // 27: gosdn.networkelement.SetPathListRequest + (*SetPathListResponse)(nil), // 28: gosdn.networkelement.SetPathListResponse + (*DeleteRequest)(nil), // 29: gosdn.networkelement.DeleteRequest + (*DeleteResponse)(nil), // 30: gosdn.networkelement.DeleteResponse + (*Change)(nil), // 31: gosdn.networkelement.Change + (*ChangeRequest)(nil), // 32: gosdn.networkelement.ChangeRequest + (*SetChange)(nil), // 33: gosdn.networkelement.SetChange + (*GetChangeListRequest)(nil), // 34: gosdn.networkelement.GetChangeListRequest + (*GetChangeListResponse)(nil), // 35: gosdn.networkelement.GetChangeListResponse + (*GetChangeRequest)(nil), // 36: gosdn.networkelement.GetChangeRequest + (*GetChangeResponse)(nil), // 37: gosdn.networkelement.GetChangeResponse + (*SetChangeListRequest)(nil), // 38: gosdn.networkelement.SetChangeListRequest + (*SetChangeListResponse)(nil), // 39: gosdn.networkelement.SetChangeListResponse + (*SubscriptionList)(nil), // 40: gosdn.networkelement.SubscriptionList + (*Subscription)(nil), // 41: gosdn.networkelement.Subscription + (*SubscribePathRequest)(nil), // 42: gosdn.networkelement.SubscribePathRequest + (*SubscribePathResponse)(nil), // 43: gosdn.networkelement.SubscribePathResponse + (*plugin_registry.Plugin)(nil), // 44: gosdn.plugin_registry.Plugin + (*gnmi.Notification)(nil), // 45: gnmi.Notification + (*transport.TransportOption)(nil), // 46: gosdn.transport.TransportOption + (*conflict.Metadata)(nil), // 47: gosdn.conflict.Metadata + (*pnd.PrincipalNetworkDomain)(nil), // 48: gosdn.pnd.PrincipalNetworkDomain + (*gnmi.Path)(nil), // 49: gnmi.Path + (*gnmi.TypedValue)(nil), // 50: gnmi.TypedValue } var file_gosdn_networkelement_networkelement_proto_depIdxs = []int32{ 7, // 0: gosdn.networkelement.UpdateNetworkElementRequest.network_element:type_name -> gosdn.networkelement.ManagedNetworkElement - 42, // 1: gosdn.networkelement.ManagedNetworkElement.plugin:type_name -> gosdn.plugin_registry.Plugin - 43, // 2: gosdn.networkelement.ManagedNetworkElement.mne_notification:type_name -> gnmi.Notification - 44, // 3: gosdn.networkelement.ManagedNetworkElement.transport_option:type_name -> gosdn.transport.TransportOption - 45, // 4: gosdn.networkelement.ManagedNetworkElement.metadata:type_name -> gosdn.conflict.Metadata - 46, // 5: gosdn.networkelement.GetAllResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 44, // 1: gosdn.networkelement.ManagedNetworkElement.plugin:type_name -> gosdn.plugin_registry.Plugin + 45, // 2: gosdn.networkelement.ManagedNetworkElement.mne_notification:type_name -> gnmi.Notification + 46, // 3: gosdn.networkelement.ManagedNetworkElement.transport_option:type_name -> gosdn.transport.TransportOption + 47, // 4: gosdn.networkelement.ManagedNetworkElement.metadata:type_name -> gosdn.conflict.Metadata + 48, // 5: gosdn.networkelement.GetAllResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 7, // 6: gosdn.networkelement.GetAllResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement - 46, // 7: gosdn.networkelement.GetAllFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 48, // 7: gosdn.networkelement.GetAllFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 8, // 8: gosdn.networkelement.GetAllFlattenedResponse.mne:type_name -> gosdn.networkelement.FlattenedManagedNetworkElement - 46, // 9: gosdn.networkelement.GetResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 48, // 9: gosdn.networkelement.GetResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 7, // 10: gosdn.networkelement.GetResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement - 46, // 11: gosdn.networkelement.GetFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 48, // 11: gosdn.networkelement.GetFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 8, // 12: gosdn.networkelement.GetFlattenedResponse.mne:type_name -> gosdn.networkelement.FlattenedManagedNetworkElement - 44, // 13: gosdn.networkelement.SetMne.transport_option:type_name -> gosdn.transport.TransportOption - 17, // 14: gosdn.networkelement.AddListRequest.mne:type_name -> gosdn.networkelement.SetMne - 24, // 15: gosdn.networkelement.AddListResponse.responses:type_name -> gosdn.networkelement.SetResponse - 46, // 16: gosdn.networkelement.GetPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 43, // 17: gosdn.networkelement.GetPathResponse.mne_notification:type_name -> gnmi.Notification - 46, // 18: gosdn.networkelement.GetIntendedPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 43, // 19: gosdn.networkelement.GetIntendedPathResponse.mne_notification:type_name -> gnmi.Notification - 30, // 20: gosdn.networkelement.SetPathListRequest.change_request:type_name -> gosdn.networkelement.ChangeRequest - 24, // 21: gosdn.networkelement.SetPathListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 46, // 13: gosdn.networkelement.SetMne.transport_option:type_name -> gosdn.transport.TransportOption + 19, // 14: gosdn.networkelement.AddListRequest.mne:type_name -> gosdn.networkelement.SetMne + 26, // 15: gosdn.networkelement.AddListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 48, // 16: gosdn.networkelement.GetPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 45, // 17: gosdn.networkelement.GetPathResponse.mne_notification:type_name -> gnmi.Notification + 48, // 18: gosdn.networkelement.GetIntendedPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 45, // 19: gosdn.networkelement.GetIntendedPathResponse.mne_notification:type_name -> gnmi.Notification + 32, // 20: gosdn.networkelement.SetPathListRequest.change_request:type_name -> gosdn.networkelement.ChangeRequest + 26, // 21: gosdn.networkelement.SetPathListResponse.responses:type_name -> gosdn.networkelement.SetResponse 0, // 22: gosdn.networkelement.Change.state:type_name -> gosdn.networkelement.ChangeState - 43, // 23: gosdn.networkelement.Change.diff:type_name -> gnmi.Notification - 47, // 24: gosdn.networkelement.ChangeRequest.path:type_name -> gnmi.Path - 48, // 25: gosdn.networkelement.ChangeRequest.value:type_name -> gnmi.TypedValue + 45, // 23: gosdn.networkelement.Change.diff:type_name -> gnmi.Notification + 49, // 24: gosdn.networkelement.ChangeRequest.path:type_name -> gnmi.Path + 50, // 25: gosdn.networkelement.ChangeRequest.value:type_name -> gnmi.TypedValue 1, // 26: gosdn.networkelement.ChangeRequest.api_op:type_name -> gosdn.networkelement.ApiOperation 2, // 27: gosdn.networkelement.SetChange.op:type_name -> gosdn.networkelement.Operation - 46, // 28: gosdn.networkelement.GetChangeListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 29, // 29: gosdn.networkelement.GetChangeListResponse.change:type_name -> gosdn.networkelement.Change - 46, // 30: gosdn.networkelement.GetChangeResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 29, // 31: gosdn.networkelement.GetChangeResponse.change:type_name -> gosdn.networkelement.Change - 31, // 32: gosdn.networkelement.SetChangeListRequest.change:type_name -> gosdn.networkelement.SetChange - 24, // 33: gosdn.networkelement.SetChangeListResponse.responses:type_name -> gosdn.networkelement.SetResponse - 39, // 34: gosdn.networkelement.SubscriptionList.subscription:type_name -> gosdn.networkelement.Subscription + 48, // 28: gosdn.networkelement.GetChangeListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 31, // 29: gosdn.networkelement.GetChangeListResponse.change:type_name -> gosdn.networkelement.Change + 48, // 30: gosdn.networkelement.GetChangeResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 31, // 31: gosdn.networkelement.GetChangeResponse.change:type_name -> gosdn.networkelement.Change + 33, // 32: gosdn.networkelement.SetChangeListRequest.change:type_name -> gosdn.networkelement.SetChange + 26, // 33: gosdn.networkelement.SetChangeListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 41, // 34: gosdn.networkelement.SubscriptionList.subscription:type_name -> gosdn.networkelement.Subscription 3, // 35: gosdn.networkelement.SubscriptionList.mode:type_name -> gosdn.networkelement.SubscriptionMode 4, // 36: gosdn.networkelement.Subscription.stream_mode:type_name -> gosdn.networkelement.StreamMode - 38, // 37: gosdn.networkelement.SubscribePathRequest.sublist:type_name -> gosdn.networkelement.SubscriptionList - 43, // 38: gosdn.networkelement.SubscribePathResponse.mne_notification:type_name -> gnmi.Notification + 40, // 37: gosdn.networkelement.SubscribePathRequest.sublist:type_name -> gosdn.networkelement.SubscriptionList + 45, // 38: gosdn.networkelement.SubscribePathResponse.mne_notification:type_name -> gnmi.Notification 5, // 39: gosdn.networkelement.NetworkElementService.Update:input_type -> gosdn.networkelement.UpdateNetworkElementRequest 9, // 40: gosdn.networkelement.NetworkElementService.GetAll:input_type -> gosdn.networkelement.GetAllRequest 11, // 41: gosdn.networkelement.NetworkElementService.GetAllFlattened:input_type -> gosdn.networkelement.GetAllFlattenedRequest - 13, // 42: gosdn.networkelement.NetworkElementService.Get:input_type -> gosdn.networkelement.GetRequest - 15, // 43: gosdn.networkelement.NetworkElementService.GetFlattened:input_type -> gosdn.networkelement.GetFlattenedRequest - 18, // 44: gosdn.networkelement.NetworkElementService.AddList:input_type -> gosdn.networkelement.AddListRequest - 20, // 45: gosdn.networkelement.NetworkElementService.GetPath:input_type -> gosdn.networkelement.GetPathRequest - 22, // 46: gosdn.networkelement.NetworkElementService.GetIntendedPath:input_type -> gosdn.networkelement.GetIntendedPathRequest - 25, // 47: gosdn.networkelement.NetworkElementService.SetPathList:input_type -> gosdn.networkelement.SetPathListRequest - 27, // 48: gosdn.networkelement.NetworkElementService.Delete:input_type -> gosdn.networkelement.DeleteRequest - 32, // 49: gosdn.networkelement.NetworkElementService.GetChangeList:input_type -> gosdn.networkelement.GetChangeListRequest - 34, // 50: gosdn.networkelement.NetworkElementService.GetChange:input_type -> gosdn.networkelement.GetChangeRequest - 36, // 51: gosdn.networkelement.NetworkElementService.SetChangeList:input_type -> gosdn.networkelement.SetChangeListRequest - 40, // 52: gosdn.networkelement.NetworkElementService.SubscribePath:input_type -> gosdn.networkelement.SubscribePathRequest - 6, // 53: gosdn.networkelement.NetworkElementService.Update:output_type -> gosdn.networkelement.UpdateNetworkElementResponse - 10, // 54: gosdn.networkelement.NetworkElementService.GetAll:output_type -> gosdn.networkelement.GetAllResponse - 12, // 55: gosdn.networkelement.NetworkElementService.GetAllFlattened:output_type -> gosdn.networkelement.GetAllFlattenedResponse - 14, // 56: gosdn.networkelement.NetworkElementService.Get:output_type -> gosdn.networkelement.GetResponse - 16, // 57: gosdn.networkelement.NetworkElementService.GetFlattened:output_type -> gosdn.networkelement.GetFlattenedResponse - 19, // 58: gosdn.networkelement.NetworkElementService.AddList:output_type -> gosdn.networkelement.AddListResponse - 21, // 59: gosdn.networkelement.NetworkElementService.GetPath:output_type -> gosdn.networkelement.GetPathResponse - 23, // 60: gosdn.networkelement.NetworkElementService.GetIntendedPath:output_type -> gosdn.networkelement.GetIntendedPathResponse - 26, // 61: gosdn.networkelement.NetworkElementService.SetPathList:output_type -> gosdn.networkelement.SetPathListResponse - 28, // 62: gosdn.networkelement.NetworkElementService.Delete:output_type -> gosdn.networkelement.DeleteResponse - 33, // 63: gosdn.networkelement.NetworkElementService.GetChangeList:output_type -> gosdn.networkelement.GetChangeListResponse - 35, // 64: gosdn.networkelement.NetworkElementService.GetChange:output_type -> gosdn.networkelement.GetChangeResponse - 37, // 65: gosdn.networkelement.NetworkElementService.SetChangeList:output_type -> gosdn.networkelement.SetChangeListResponse - 41, // 66: gosdn.networkelement.NetworkElementService.SubscribePath:output_type -> gosdn.networkelement.SubscribePathResponse - 53, // [53:67] is the sub-list for method output_type - 39, // [39:53] is the sub-list for method input_type + 15, // 42: gosdn.networkelement.NetworkElementService.Get:input_type -> gosdn.networkelement.GetRequest + 13, // 43: gosdn.networkelement.NetworkElementService.ParseYang:input_type -> gosdn.networkelement.ParseYangRequest + 17, // 44: gosdn.networkelement.NetworkElementService.GetFlattened:input_type -> gosdn.networkelement.GetFlattenedRequest + 20, // 45: gosdn.networkelement.NetworkElementService.AddList:input_type -> gosdn.networkelement.AddListRequest + 22, // 46: gosdn.networkelement.NetworkElementService.GetPath:input_type -> gosdn.networkelement.GetPathRequest + 24, // 47: gosdn.networkelement.NetworkElementService.GetIntendedPath:input_type -> gosdn.networkelement.GetIntendedPathRequest + 27, // 48: gosdn.networkelement.NetworkElementService.SetPathList:input_type -> gosdn.networkelement.SetPathListRequest + 29, // 49: gosdn.networkelement.NetworkElementService.Delete:input_type -> gosdn.networkelement.DeleteRequest + 34, // 50: gosdn.networkelement.NetworkElementService.GetChangeList:input_type -> gosdn.networkelement.GetChangeListRequest + 36, // 51: gosdn.networkelement.NetworkElementService.GetChange:input_type -> gosdn.networkelement.GetChangeRequest + 38, // 52: gosdn.networkelement.NetworkElementService.SetChangeList:input_type -> gosdn.networkelement.SetChangeListRequest + 42, // 53: gosdn.networkelement.NetworkElementService.SubscribePath:input_type -> gosdn.networkelement.SubscribePathRequest + 6, // 54: gosdn.networkelement.NetworkElementService.Update:output_type -> gosdn.networkelement.UpdateNetworkElementResponse + 10, // 55: gosdn.networkelement.NetworkElementService.GetAll:output_type -> gosdn.networkelement.GetAllResponse + 12, // 56: gosdn.networkelement.NetworkElementService.GetAllFlattened:output_type -> gosdn.networkelement.GetAllFlattenedResponse + 16, // 57: gosdn.networkelement.NetworkElementService.Get:output_type -> gosdn.networkelement.GetResponse + 14, // 58: gosdn.networkelement.NetworkElementService.ParseYang:output_type -> gosdn.networkelement.ParseYangResponse + 18, // 59: gosdn.networkelement.NetworkElementService.GetFlattened:output_type -> gosdn.networkelement.GetFlattenedResponse + 21, // 60: gosdn.networkelement.NetworkElementService.AddList:output_type -> gosdn.networkelement.AddListResponse + 23, // 61: gosdn.networkelement.NetworkElementService.GetPath:output_type -> gosdn.networkelement.GetPathResponse + 25, // 62: gosdn.networkelement.NetworkElementService.GetIntendedPath:output_type -> gosdn.networkelement.GetIntendedPathResponse + 28, // 63: gosdn.networkelement.NetworkElementService.SetPathList:output_type -> gosdn.networkelement.SetPathListResponse + 30, // 64: gosdn.networkelement.NetworkElementService.Delete:output_type -> gosdn.networkelement.DeleteResponse + 35, // 65: gosdn.networkelement.NetworkElementService.GetChangeList:output_type -> gosdn.networkelement.GetChangeListResponse + 37, // 66: gosdn.networkelement.NetworkElementService.GetChange:output_type -> gosdn.networkelement.GetChangeResponse + 39, // 67: gosdn.networkelement.NetworkElementService.SetChangeList:output_type -> gosdn.networkelement.SetChangeListResponse + 43, // 68: gosdn.networkelement.NetworkElementService.SubscribePath:output_type -> gosdn.networkelement.SubscribePathResponse + 54, // [54:69] is the sub-list for method output_type + 39, // [39:54] is the sub-list for method input_type 39, // [39:39] is the sub-list for extension type_name 39, // [39:39] is the sub-list for extension extendee 0, // [0:39] is the sub-list for field type_name @@ -3310,459 +3363,13 @@ func file_gosdn_networkelement_networkelement_proto_init() { if File_gosdn_networkelement_networkelement_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_networkelement_networkelement_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*UpdateNetworkElementRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*UpdateNetworkElementResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*ManagedNetworkElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*FlattenedManagedNetworkElement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetAllRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*GetAllResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*GetAllFlattenedRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*GetAllFlattenedResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*GetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*GetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*GetFlattenedRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*GetFlattenedResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*SetMne); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*AddListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*AddListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*GetPathRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*GetPathResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*GetIntendedPathRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*GetIntendedPathResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*SetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*SetPathListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*SetPathListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*DeleteResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*Change); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*ChangeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*SetChange); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*GetChangeListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*GetChangeListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*GetChangeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[30].Exporter = func(v any, i int) any { - switch v := v.(*GetChangeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[31].Exporter = func(v any, i int) any { - switch v := v.(*SetChangeListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[32].Exporter = func(v any, i int) any { - switch v := v.(*SetChangeListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[33].Exporter = func(v any, i int) any { - switch v := v.(*SubscriptionList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*Subscription); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*SubscribePathRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_networkelement_networkelement_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*SubscribePathResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gosdn_networkelement_networkelement_proto_rawDesc, NumEnums: 5, - NumMessages: 37, + NumMessages: 39, NumExtensions: 0, NumServices: 1, }, diff --git a/api/go/gosdn/networkelement/networkelement.pb.gw.go b/api/go/gosdn/networkelement/networkelement.pb.gw.go index fc794e3c4..642198688 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.gw.go +++ b/api/go/gosdn/networkelement/networkelement.pb.gw.go @@ -163,6 +163,42 @@ func local_request_NetworkElementService_Get_0(ctx context.Context, marshaler ru } +var ( + filter_NetworkElementService_ParseYang_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_NetworkElementService_ParseYang_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ParseYangRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_ParseYang_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ParseYang(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_NetworkElementService_ParseYang_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ParseYangRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_ParseYang_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ParseYang(ctx, &protoReq) + return msg, metadata, err + +} + func request_NetworkElementService_AddList_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq AddListRequest var metadata runtime.ServerMetadata @@ -679,6 +715,31 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim }) + mux.Handle("GET", pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_NetworkElementService_ParseYang_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_ParseYang_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -986,6 +1047,28 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim }) + mux.Handle("GET", pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_NetworkElementService_ParseYang_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_ParseYang_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1172,6 +1255,8 @@ var ( pattern_NetworkElementService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"mnes", "mneid"}, "")) + pattern_NetworkElementService_ParseYang_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"yang", "parse"}, "")) + pattern_NetworkElementService_AddList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"mnes"}, "")) pattern_NetworkElementService_GetPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"mnes", "mneid", "paths", "path"}, "")) @@ -1196,6 +1281,8 @@ var ( forward_NetworkElementService_Get_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_ParseYang_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_AddList_0 = runtime.ForwardResponseMessage forward_NetworkElementService_GetPath_0 = runtime.ForwardResponseMessage diff --git a/api/go/gosdn/networkelement/networkelement_grpc.pb.go b/api/go/gosdn/networkelement/networkelement_grpc.pb.go index bab93548d..5bd523242 100644 --- a/api/go/gosdn/networkelement/networkelement_grpc.pb.go +++ b/api/go/gosdn/networkelement/networkelement_grpc.pb.go @@ -23,6 +23,7 @@ const ( NetworkElementService_GetAll_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetAll" NetworkElementService_GetAllFlattened_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetAllFlattened" NetworkElementService_Get_FullMethodName = "/gosdn.networkelement.NetworkElementService/Get" + NetworkElementService_ParseYang_FullMethodName = "/gosdn.networkelement.NetworkElementService/ParseYang" NetworkElementService_GetFlattened_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetFlattened" NetworkElementService_AddList_FullMethodName = "/gosdn.networkelement.NetworkElementService/AddList" NetworkElementService_GetPath_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetPath" @@ -56,6 +57,9 @@ type NetworkElementServiceClient interface { // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) + // Allows to request a specific Managed Network Element which is managed by a + // specific Principal Network Domain. + ParseYang(ctx context.Context, in *ParseYangRequest, opts ...grpc.CallOption) (*ParseYangResponse, error) // TODO: add http option // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. A flattened version of a Managed @@ -140,6 +144,16 @@ func (c *networkElementServiceClient) Get(ctx context.Context, in *GetRequest, o return out, nil } +func (c *networkElementServiceClient) ParseYang(ctx context.Context, in *ParseYangRequest, opts ...grpc.CallOption) (*ParseYangResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ParseYangResponse) + err := c.cc.Invoke(ctx, NetworkElementService_ParseYang_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *networkElementServiceClient) GetFlattened(ctx context.Context, in *GetFlattenedRequest, opts ...grpc.CallOption) (*GetFlattenedResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetFlattenedResponse) @@ -270,6 +284,9 @@ type NetworkElementServiceServer interface { // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. Get(context.Context, *GetRequest) (*GetResponse, error) + // Allows to request a specific Managed Network Element which is managed by a + // specific Principal Network Domain. + ParseYang(context.Context, *ParseYangRequest) (*ParseYangResponse, error) // TODO: add http option // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. A flattened version of a Managed @@ -326,6 +343,9 @@ func (UnimplementedNetworkElementServiceServer) GetAllFlattened(context.Context, func (UnimplementedNetworkElementServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") } +func (UnimplementedNetworkElementServiceServer) ParseYang(context.Context, *ParseYangRequest) (*ParseYangResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ParseYang not implemented") +} func (UnimplementedNetworkElementServiceServer) GetFlattened(context.Context, *GetFlattenedRequest) (*GetFlattenedResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFlattened not implemented") } @@ -449,6 +469,24 @@ func _NetworkElementService_Get_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _NetworkElementService_ParseYang_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ParseYangRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkElementServiceServer).ParseYang(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: NetworkElementService_ParseYang_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkElementServiceServer).ParseYang(ctx, req.(*ParseYangRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _NetworkElementService_GetFlattened_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetFlattenedRequest) if err := dec(in); err != nil { @@ -645,6 +683,10 @@ var NetworkElementService_ServiceDesc = grpc.ServiceDesc{ MethodName: "Get", Handler: _NetworkElementService_Get_Handler, }, + { + MethodName: "ParseYang", + Handler: _NetworkElementService_ParseYang_Handler, + }, { MethodName: "GetFlattened", Handler: _NetworkElementService_GetFlattened_Handler, diff --git a/api/go/gosdn/plugin-internal/plugin-internal.pb.go b/api/go/gosdn/plugin-internal/plugin-internal.pb.go index 119fb45b0..490d4f78c 100644 --- a/api/go/gosdn/plugin-internal/plugin-internal.pb.go +++ b/api/go/gosdn/plugin-internal/plugin-internal.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/plugin-internal/plugin-internal.proto @@ -32,11 +32,9 @@ type GetAvailablePluginsRequest struct { func (x *GetAvailablePluginsRequest) Reset() { *x = GetAvailablePluginsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAvailablePluginsRequest) String() string { @@ -47,7 +45,7 @@ func (*GetAvailablePluginsRequest) ProtoMessage() {} func (x *GetAvailablePluginsRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -80,11 +78,9 @@ type GetAvailablePluginsResponse struct { func (x *GetAvailablePluginsResponse) Reset() { *x = GetAvailablePluginsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAvailablePluginsResponse) String() string { @@ -95,7 +91,7 @@ func (*GetAvailablePluginsResponse) ProtoMessage() {} func (x *GetAvailablePluginsResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -135,11 +131,9 @@ type GetPluginSchemaRequest struct { func (x *GetPluginSchemaRequest) Reset() { *x = GetPluginSchemaRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPluginSchemaRequest) String() string { @@ -150,7 +144,7 @@ func (*GetPluginSchemaRequest) ProtoMessage() {} func (x *GetPluginSchemaRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -189,11 +183,9 @@ type PluginSchemaPayload struct { func (x *PluginSchemaPayload) Reset() { *x = PluginSchemaPayload{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PluginSchemaPayload) String() string { @@ -204,7 +196,7 @@ func (*PluginSchemaPayload) ProtoMessage() {} func (x *PluginSchemaPayload) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -318,56 +310,6 @@ func file_gosdn_plugin_internal_plugin_internal_proto_init() { if File_gosdn_plugin_internal_plugin_internal_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*GetAvailablePluginsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*GetAvailablePluginsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*GetPluginSchemaRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*PluginSchemaPayload); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/plugin-registry/plugin-registry.pb.go b/api/go/gosdn/plugin-registry/plugin-registry.pb.go index 44f88183f..7bb50e04f 100644 --- a/api/go/gosdn/plugin-registry/plugin-registry.pb.go +++ b/api/go/gosdn/plugin-registry/plugin-registry.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/plugin-registry/plugin-registry.proto @@ -33,11 +33,9 @@ type GetRequest struct { func (x *GetRequest) Reset() { *x = GetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRequest) String() string { @@ -48,7 +46,7 @@ func (*GetRequest) ProtoMessage() {} func (x *GetRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -87,11 +85,9 @@ type GetAllRequest struct { func (x *GetAllRequest) Reset() { *x = GetAllRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAllRequest) String() string { @@ -102,7 +98,7 @@ func (*GetAllRequest) ProtoMessage() {} func (x *GetAllRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -138,11 +134,9 @@ type Query struct { func (x *Query) Reset() { *x = Query{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Query) String() string { @@ -153,7 +147,7 @@ func (*Query) ProtoMessage() {} func (x *Query) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -216,11 +210,9 @@ type GetResponse struct { func (x *GetResponse) Reset() { *x = GetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResponse) String() string { @@ -231,7 +223,7 @@ func (*GetResponse) ProtoMessage() {} func (x *GetResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -271,11 +263,9 @@ type GetDownloadRequest struct { func (x *GetDownloadRequest) Reset() { *x = GetDownloadRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetDownloadRequest) String() string { @@ -286,7 +276,7 @@ func (*GetDownloadRequest) ProtoMessage() {} func (x *GetDownloadRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -325,11 +315,9 @@ type GetDownloadPayload struct { func (x *GetDownloadPayload) Reset() { *x = GetDownloadPayload{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetDownloadPayload) String() string { @@ -340,7 +328,7 @@ func (*GetDownloadPayload) ProtoMessage() {} func (x *GetDownloadPayload) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -373,11 +361,9 @@ type DeleteRequest struct { func (x *DeleteRequest) Reset() { *x = DeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRequest) String() string { @@ -388,7 +374,7 @@ func (*DeleteRequest) ProtoMessage() {} func (x *DeleteRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -427,11 +413,9 @@ type DeleteResponse struct { func (x *DeleteResponse) Reset() { *x = DeleteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteResponse) String() string { @@ -442,7 +426,7 @@ func (*DeleteResponse) ProtoMessage() {} func (x *DeleteResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -475,11 +459,9 @@ type Plugin struct { func (x *Plugin) Reset() { *x = Plugin{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Plugin) String() string { @@ -490,7 +472,7 @@ func (*Plugin) ProtoMessage() {} func (x *Plugin) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -532,11 +514,9 @@ type Manifest struct { func (x *Manifest) Reset() { *x = Manifest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Manifest) String() string { @@ -547,7 +527,7 @@ func (*Manifest) ProtoMessage() {} func (x *Manifest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -728,128 +708,6 @@ func file_gosdn_plugin_registry_plugin_registry_proto_init() { if File_gosdn_plugin_registry_plugin_registry_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*GetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*GetAllRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*Query); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetDownloadRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*GetDownloadPayload); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*DeleteResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*Plugin); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*Manifest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[2].OneofWrappers = []any{ (*Query_Id)(nil), (*Query_Name)(nil), diff --git a/api/go/gosdn/plugin/plugin.pb.go b/api/go/gosdn/plugin/plugin.pb.go index 3f6402531..9193b62ac 100644 --- a/api/go/gosdn/plugin/plugin.pb.go +++ b/api/go/gosdn/plugin/plugin.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/plugin/plugin.proto @@ -35,11 +35,9 @@ type UnmarshalRequest struct { func (x *UnmarshalRequest) Reset() { *x = UnmarshalRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UnmarshalRequest) String() string { @@ -50,7 +48,7 @@ func (*UnmarshalRequest) ProtoMessage() {} func (x *UnmarshalRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -96,11 +94,9 @@ type UnmarshalResponse struct { func (x *UnmarshalResponse) Reset() { *x = UnmarshalResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UnmarshalResponse) String() string { @@ -111,7 +107,7 @@ func (*UnmarshalResponse) ProtoMessage() {} func (x *UnmarshalResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -144,11 +140,9 @@ type SetNodeRequest struct { func (x *SetNodeRequest) Reset() { *x = SetNodeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetNodeRequest) String() string { @@ -159,7 +153,7 @@ func (*SetNodeRequest) ProtoMessage() {} func (x *SetNodeRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -198,11 +192,9 @@ type SetNodeResponse struct { func (x *SetNodeResponse) Reset() { *x = SetNodeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetNodeResponse) String() string { @@ -213,7 +205,7 @@ func (*SetNodeResponse) ProtoMessage() {} func (x *SetNodeResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -246,11 +238,9 @@ type GetNodeRequest struct { func (x *GetNodeRequest) Reset() { *x = GetNodeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetNodeRequest) String() string { @@ -261,7 +251,7 @@ func (*GetNodeRequest) ProtoMessage() {} func (x *GetNodeRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -300,11 +290,9 @@ type GetNodeResponse struct { func (x *GetNodeResponse) Reset() { *x = GetNodeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetNodeResponse) String() string { @@ -315,7 +303,7 @@ func (*GetNodeResponse) ProtoMessage() {} func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -347,11 +335,9 @@ type DeleteNodeRequest struct { func (x *DeleteNodeRequest) Reset() { *x = DeleteNodeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteNodeRequest) String() string { @@ -362,7 +348,7 @@ func (*DeleteNodeRequest) ProtoMessage() {} func (x *DeleteNodeRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -394,11 +380,9 @@ type DeleteNodeResponse struct { func (x *DeleteNodeResponse) Reset() { *x = DeleteNodeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteNodeResponse) String() string { @@ -409,7 +393,7 @@ func (*DeleteNodeResponse) ProtoMessage() {} func (x *DeleteNodeResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -441,11 +425,9 @@ type ModelRequest struct { func (x *ModelRequest) Reset() { *x = ModelRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ModelRequest) String() string { @@ -456,7 +438,7 @@ func (*ModelRequest) ProtoMessage() {} func (x *ModelRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -488,11 +470,9 @@ type ModelResponse struct { func (x *ModelResponse) Reset() { *x = ModelResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ModelResponse) String() string { @@ -503,7 +483,7 @@ func (*ModelResponse) ProtoMessage() {} func (x *ModelResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -536,11 +516,9 @@ type DiffRequest struct { func (x *DiffRequest) Reset() { *x = DiffRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DiffRequest) String() string { @@ -551,7 +529,7 @@ func (*DiffRequest) ProtoMessage() {} func (x *DiffRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -590,11 +568,9 @@ type DiffResponse struct { func (x *DiffResponse) Reset() { *x = DiffResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DiffResponse) String() string { @@ -605,7 +581,7 @@ func (*DiffResponse) ProtoMessage() {} func (x *DiffResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -639,11 +615,9 @@ type ValidateChangeRequest struct { func (x *ValidateChangeRequest) Reset() { *x = ValidateChangeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateChangeRequest) String() string { @@ -654,7 +628,7 @@ func (*ValidateChangeRequest) ProtoMessage() {} func (x *ValidateChangeRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -700,11 +674,9 @@ type ValidateChangeResponse struct { func (x *ValidateChangeResponse) Reset() { *x = ValidateChangeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ValidateChangeResponse) String() string { @@ -715,7 +687,7 @@ func (*ValidateChangeResponse) ProtoMessage() {} func (x *ValidateChangeResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -747,11 +719,9 @@ type PruneConfigFalseRequest struct { func (x *PruneConfigFalseRequest) Reset() { *x = PruneConfigFalseRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PruneConfigFalseRequest) String() string { @@ -762,7 +732,7 @@ func (*PruneConfigFalseRequest) ProtoMessage() {} func (x *PruneConfigFalseRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -794,11 +764,9 @@ type PruneConfigFalseResponse struct { func (x *PruneConfigFalseResponse) Reset() { *x = PruneConfigFalseResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PruneConfigFalseResponse) String() string { @@ -809,7 +777,7 @@ func (*PruneConfigFalseResponse) ProtoMessage() {} func (x *PruneConfigFalseResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -839,11 +807,9 @@ type SchemaTreeGzipRequest struct { func (x *SchemaTreeGzipRequest) Reset() { *x = SchemaTreeGzipRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SchemaTreeGzipRequest) String() string { @@ -854,7 +820,7 @@ func (*SchemaTreeGzipRequest) ProtoMessage() {} func (x *SchemaTreeGzipRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -879,11 +845,9 @@ type Payload struct { func (x *Payload) Reset() { *x = Payload{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_plugin_plugin_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Payload) String() string { @@ -894,7 +858,7 @@ func (*Payload) ProtoMessage() {} func (x *Payload) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_plugin_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1138,224 +1102,6 @@ func file_gosdn_plugin_plugin_proto_init() { if File_gosdn_plugin_plugin_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_plugin_plugin_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*UnmarshalRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*UnmarshalResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*SetNodeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*SetNodeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetNodeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*GetNodeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*DeleteNodeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*DeleteNodeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*ModelRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*ModelResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*DiffRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*DiffResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*ValidateChangeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*ValidateChangeResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*PruneConfigFalseRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*PruneConfigFalseResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*SchemaTreeGzipRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_plugin_plugin_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*Payload); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/pnd/pnd.pb.go b/api/go/gosdn/pnd/pnd.pb.go index 8c73f1394..16f5b733d 100644 --- a/api/go/gosdn/pnd/pnd.pb.go +++ b/api/go/gosdn/pnd/pnd.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/pnd/pnd.proto @@ -38,11 +38,9 @@ type PrincipalNetworkDomain struct { func (x *PrincipalNetworkDomain) Reset() { *x = PrincipalNetworkDomain{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PrincipalNetworkDomain) String() string { @@ -53,7 +51,7 @@ func (*PrincipalNetworkDomain) ProtoMessage() {} func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -100,11 +98,9 @@ type GetPndRequest struct { func (x *GetPndRequest) Reset() { *x = GetPndRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPndRequest) String() string { @@ -115,7 +111,7 @@ func (*GetPndRequest) ProtoMessage() {} func (x *GetPndRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -155,11 +151,9 @@ type GetPndResponse struct { func (x *GetPndResponse) Reset() { *x = GetPndResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPndResponse) String() string { @@ -170,7 +164,7 @@ func (*GetPndResponse) ProtoMessage() {} func (x *GetPndResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -209,11 +203,9 @@ type GetPndListRequest struct { func (x *GetPndListRequest) Reset() { *x = GetPndListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPndListRequest) String() string { @@ -224,7 +216,7 @@ func (*GetPndListRequest) ProtoMessage() {} func (x *GetPndListRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -257,11 +249,9 @@ type GetPndListResponse struct { func (x *GetPndListResponse) Reset() { *x = GetPndListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetPndListResponse) String() string { @@ -272,7 +262,7 @@ func (*GetPndListResponse) ProtoMessage() {} func (x *GetPndListResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -312,11 +302,9 @@ type CreatePndListRequest struct { func (x *CreatePndListRequest) Reset() { *x = CreatePndListRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreatePndListRequest) String() string { @@ -327,7 +315,7 @@ func (*CreatePndListRequest) ProtoMessage() {} func (x *CreatePndListRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -367,11 +355,9 @@ type PndCreateProperties struct { func (x *PndCreateProperties) Reset() { *x = PndCreateProperties{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PndCreateProperties) String() string { @@ -382,7 +368,7 @@ func (*PndCreateProperties) ProtoMessage() {} func (x *PndCreateProperties) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -421,11 +407,9 @@ type CreatePndListResponse struct { func (x *CreatePndListResponse) Reset() { *x = CreatePndListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreatePndListResponse) String() string { @@ -436,7 +420,7 @@ func (*CreatePndListResponse) ProtoMessage() {} func (x *CreatePndListResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -469,11 +453,9 @@ type DeletePndRequest struct { func (x *DeletePndRequest) Reset() { *x = DeletePndRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeletePndRequest) String() string { @@ -484,7 +466,7 @@ func (*DeletePndRequest) ProtoMessage() {} func (x *DeletePndRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -523,11 +505,9 @@ type DeletePndResponse struct { func (x *DeletePndResponse) Reset() { *x = DeletePndResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_pnd_pnd_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_pnd_pnd_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeletePndResponse) String() string { @@ -538,7 +518,7 @@ func (*DeletePndResponse) ProtoMessage() {} func (x *DeletePndResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_pnd_pnd_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -724,128 +704,6 @@ func file_gosdn_pnd_pnd_proto_init() { if File_gosdn_pnd_pnd_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_pnd_pnd_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*PrincipalNetworkDomain); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*GetPndRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*GetPndResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetPndListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetPndListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*CreatePndListRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*PndCreateProperties); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*CreatePndListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*DeletePndRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_pnd_pnd_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*DeletePndResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/rbac/rbac.pb.go b/api/go/gosdn/rbac/rbac.pb.go index ec77ac558..0a98e9ecf 100644 --- a/api/go/gosdn/rbac/rbac.pb.go +++ b/api/go/gosdn/rbac/rbac.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/rbac/rbac.proto @@ -37,11 +37,9 @@ type LoginRequest struct { func (x *LoginRequest) Reset() { *x = LoginRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_rbac_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_rbac_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginRequest) String() string { @@ -52,7 +50,7 @@ func (*LoginRequest) ProtoMessage() {} func (x *LoginRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_rbac_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -99,11 +97,9 @@ type LoginResponse struct { func (x *LoginResponse) Reset() { *x = LoginResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_rbac_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_rbac_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginResponse) String() string { @@ -114,7 +110,7 @@ func (*LoginResponse) ProtoMessage() {} func (x *LoginResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_rbac_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -155,11 +151,9 @@ type LogoutRequest struct { func (x *LogoutRequest) Reset() { *x = LogoutRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_rbac_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_rbac_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LogoutRequest) String() string { @@ -170,7 +164,7 @@ func (*LogoutRequest) ProtoMessage() {} func (x *LogoutRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_rbac_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -209,11 +203,9 @@ type LogoutResponse struct { func (x *LogoutResponse) Reset() { *x = LogoutResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_rbac_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_rbac_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LogoutResponse) String() string { @@ -224,7 +216,7 @@ func (*LogoutResponse) ProtoMessage() {} func (x *LogoutResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_rbac_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -333,56 +325,6 @@ func file_gosdn_rbac_rbac_proto_init() { if File_gosdn_rbac_rbac_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_rbac_rbac_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*LoginRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_rbac_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*LoginResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_rbac_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*LogoutRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_rbac_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*LogoutResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/rbac/role.pb.go b/api/go/gosdn/rbac/role.pb.go index 8d138011a..aacf29035 100644 --- a/api/go/gosdn/rbac/role.pb.go +++ b/api/go/gosdn/rbac/role.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/rbac/role.proto @@ -37,11 +37,9 @@ type Role struct { func (x *Role) Reset() { *x = Role{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Role) String() string { @@ -52,7 +50,7 @@ func (*Role) ProtoMessage() {} func (x *Role) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -107,11 +105,9 @@ type CreateRolesRequest struct { func (x *CreateRolesRequest) Reset() { *x = CreateRolesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateRolesRequest) String() string { @@ -122,7 +118,7 @@ func (*CreateRolesRequest) ProtoMessage() {} func (x *CreateRolesRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -161,11 +157,9 @@ type CreateRolesResponse struct { func (x *CreateRolesResponse) Reset() { *x = CreateRolesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateRolesResponse) String() string { @@ -176,7 +170,7 @@ func (*CreateRolesResponse) ProtoMessage() {} func (x *CreateRolesResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -211,11 +205,9 @@ type GetRoleRequest struct { func (x *GetRoleRequest) Reset() { *x = GetRoleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRoleRequest) String() string { @@ -226,7 +218,7 @@ func (*GetRoleRequest) ProtoMessage() {} func (x *GetRoleRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -273,11 +265,9 @@ type GetRoleResponse struct { func (x *GetRoleResponse) Reset() { *x = GetRoleResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRoleResponse) String() string { @@ -288,7 +278,7 @@ func (*GetRoleResponse) ProtoMessage() {} func (x *GetRoleResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -328,11 +318,9 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRolesRequest) String() string { @@ -343,7 +331,7 @@ func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -376,11 +364,9 @@ type GetRolesResponse struct { func (x *GetRolesResponse) Reset() { *x = GetRolesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRolesResponse) String() string { @@ -391,7 +377,7 @@ func (*GetRolesResponse) ProtoMessage() {} func (x *GetRolesResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -432,11 +418,9 @@ type UpdateRolesRequest struct { func (x *UpdateRolesRequest) Reset() { *x = UpdateRolesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateRolesRequest) String() string { @@ -447,7 +431,7 @@ func (*UpdateRolesRequest) ProtoMessage() {} func (x *UpdateRolesRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -486,11 +470,9 @@ type UpdateRolesResponse struct { func (x *UpdateRolesResponse) Reset() { *x = UpdateRolesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateRolesResponse) String() string { @@ -501,7 +483,7 @@ func (*UpdateRolesResponse) ProtoMessage() {} func (x *UpdateRolesResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -536,11 +518,9 @@ type DeletePermissionsForRoleRequest struct { func (x *DeletePermissionsForRoleRequest) Reset() { *x = DeletePermissionsForRoleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeletePermissionsForRoleRequest) String() string { @@ -551,7 +531,7 @@ func (*DeletePermissionsForRoleRequest) ProtoMessage() {} func (x *DeletePermissionsForRoleRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -597,11 +577,9 @@ type DeletePermissionsForRoleResponse struct { func (x *DeletePermissionsForRoleResponse) Reset() { *x = DeletePermissionsForRoleResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeletePermissionsForRoleResponse) String() string { @@ -612,7 +590,7 @@ func (*DeletePermissionsForRoleResponse) ProtoMessage() {} func (x *DeletePermissionsForRoleResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -646,11 +624,9 @@ type DeleteRolesRequest struct { func (x *DeleteRolesRequest) Reset() { *x = DeleteRolesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRolesRequest) String() string { @@ -661,7 +637,7 @@ func (*DeleteRolesRequest) ProtoMessage() {} func (x *DeleteRolesRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -700,11 +676,9 @@ type DeleteRolesResponse struct { func (x *DeleteRolesResponse) Reset() { *x = DeleteRolesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_role_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_role_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRolesResponse) String() string { @@ -715,7 +689,7 @@ func (*DeleteRolesResponse) ProtoMessage() {} func (x *DeleteRolesResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_role_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -928,164 +902,6 @@ func file_gosdn_rbac_role_proto_init() { return } file_gosdn_rbac_rbac_proto_init() - if !protoimpl.UnsafeEnabled { - file_gosdn_rbac_role_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Role); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*CreateRolesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*CreateRolesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetRoleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetRoleResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*GetRolesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*GetRolesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*UpdateRolesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*UpdateRolesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*DeletePermissionsForRoleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*DeletePermissionsForRoleResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRolesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_role_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRolesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/rbac/user.pb.go b/api/go/gosdn/rbac/user.pb.go index 745d534cf..6c5c74f57 100644 --- a/api/go/gosdn/rbac/user.pb.go +++ b/api/go/gosdn/rbac/user.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/rbac/user.proto @@ -40,11 +40,9 @@ type User struct { func (x *User) Reset() { *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *User) String() string { @@ -55,7 +53,7 @@ func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -127,11 +125,9 @@ type UpdateUser struct { func (x *UpdateUser) Reset() { *x = UpdateUser{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateUser) String() string { @@ -142,7 +138,7 @@ func (*UpdateUser) ProtoMessage() {} func (x *UpdateUser) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -211,11 +207,9 @@ type CreateUsersRequest struct { func (x *CreateUsersRequest) Reset() { *x = CreateUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateUsersRequest) String() string { @@ -226,7 +220,7 @@ func (*CreateUsersRequest) ProtoMessage() {} func (x *CreateUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -265,11 +259,9 @@ type CreateUsersResponse struct { func (x *CreateUsersResponse) Reset() { *x = CreateUsersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateUsersResponse) String() string { @@ -280,7 +272,7 @@ func (*CreateUsersResponse) ProtoMessage() {} func (x *CreateUsersResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -315,11 +307,9 @@ type GetUserRequest struct { func (x *GetUserRequest) Reset() { *x = GetUserRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetUserRequest) String() string { @@ -330,7 +320,7 @@ func (*GetUserRequest) ProtoMessage() {} func (x *GetUserRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -377,11 +367,9 @@ type GetUserResponse struct { func (x *GetUserResponse) Reset() { *x = GetUserResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetUserResponse) String() string { @@ -392,7 +380,7 @@ func (*GetUserResponse) ProtoMessage() {} func (x *GetUserResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -432,11 +420,9 @@ type GetUsersRequest struct { func (x *GetUsersRequest) Reset() { *x = GetUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetUsersRequest) String() string { @@ -447,7 +433,7 @@ func (*GetUsersRequest) ProtoMessage() {} func (x *GetUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -480,11 +466,9 @@ type GetUsersResponse struct { func (x *GetUsersResponse) Reset() { *x = GetUsersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetUsersResponse) String() string { @@ -495,7 +479,7 @@ func (*GetUsersResponse) ProtoMessage() {} func (x *GetUsersResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -536,11 +520,9 @@ type UpdateUsersRequest struct { func (x *UpdateUsersRequest) Reset() { *x = UpdateUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateUsersRequest) String() string { @@ -551,7 +533,7 @@ func (*UpdateUsersRequest) ProtoMessage() {} func (x *UpdateUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -590,11 +572,9 @@ type UpdateUsersResponse struct { func (x *UpdateUsersResponse) Reset() { *x = UpdateUsersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateUsersResponse) String() string { @@ -605,7 +585,7 @@ func (*UpdateUsersResponse) ProtoMessage() {} func (x *UpdateUsersResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -639,11 +619,9 @@ type DeleteUsersRequest struct { func (x *DeleteUsersRequest) Reset() { *x = DeleteUsersRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteUsersRequest) String() string { @@ -654,7 +632,7 @@ func (*DeleteUsersRequest) ProtoMessage() {} func (x *DeleteUsersRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -693,11 +671,9 @@ type DeleteUsersResponse struct { func (x *DeleteUsersResponse) Reset() { *x = DeleteUsersResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_rbac_user_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_rbac_user_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteUsersResponse) String() string { @@ -708,7 +684,7 @@ func (*DeleteUsersResponse) ProtoMessage() {} func (x *DeleteUsersResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_rbac_user_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -929,152 +905,6 @@ func file_gosdn_rbac_user_proto_init() { return } file_gosdn_rbac_rbac_proto_init() - if !protoimpl.UnsafeEnabled { - file_gosdn_rbac_user_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*UpdateUser); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*CreateUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*CreateUsersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetUserRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*GetUserResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*GetUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*GetUsersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*UpdateUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*UpdateUsersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*DeleteUsersRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_rbac_user_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*DeleteUsersResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/southbound/southbound.pb.go b/api/go/gosdn/southbound/southbound.pb.go index 3310bcc2e..bf475590f 100644 --- a/api/go/gosdn/southbound/southbound.pb.go +++ b/api/go/gosdn/southbound/southbound.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/southbound/southbound.proto @@ -87,11 +87,9 @@ type GetSchemaRequest struct { func (x *GetSchemaRequest) Reset() { *x = GetSchemaRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_southbound_southbound_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_southbound_southbound_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetSchemaRequest) String() string { @@ -102,7 +100,7 @@ func (*GetSchemaRequest) ProtoMessage() {} func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_southbound_southbound_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -148,11 +146,9 @@ type Payload struct { func (x *Payload) Reset() { *x = Payload{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_southbound_southbound_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_southbound_southbound_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Payload) String() string { @@ -163,7 +159,7 @@ func (*Payload) ProtoMessage() {} func (x *Payload) ProtoReflect() protoreflect.Message { mi := &file_gosdn_southbound_southbound_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -196,11 +192,9 @@ type SouthboundInterface struct { func (x *SouthboundInterface) Reset() { *x = SouthboundInterface{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_southbound_southbound_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_southbound_southbound_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SouthboundInterface) String() string { @@ -211,7 +205,7 @@ func (*SouthboundInterface) ProtoMessage() {} func (x *SouthboundInterface) ProtoReflect() protoreflect.Message { mi := &file_gosdn_southbound_southbound_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -315,44 +309,6 @@ func file_gosdn_southbound_southbound_proto_init() { if File_gosdn_southbound_southbound_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_southbound_southbound_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*GetSchemaRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_southbound_southbound_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Payload); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_southbound_southbound_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*SouthboundInterface); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go index 617bea4d2..1691a7cf1 100644 --- a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go +++ b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/subscriptionmanagement/subscriptionmanagement.proto @@ -38,11 +38,9 @@ type Subscription struct { func (x *Subscription) Reset() { *x = Subscription{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Subscription) String() string { @@ -53,7 +51,7 @@ func (*Subscription) ProtoMessage() {} func (x *Subscription) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -120,11 +118,9 @@ type Path struct { func (x *Path) Reset() { *x = Path{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Path) String() string { @@ -135,7 +131,7 @@ func (*Path) ProtoMessage() {} func (x *Path) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -169,11 +165,9 @@ type SubscribeOptions struct { func (x *SubscribeOptions) Reset() { *x = SubscribeOptions{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SubscribeOptions) String() string { @@ -184,7 +178,7 @@ func (*SubscribeOptions) ProtoMessage() {} func (x *SubscribeOptions) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -230,11 +224,9 @@ type GetAllRequest struct { func (x *GetAllRequest) Reset() { *x = GetAllRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAllRequest) String() string { @@ -245,7 +237,7 @@ func (*GetAllRequest) ProtoMessage() {} func (x *GetAllRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -278,11 +270,9 @@ type GetAllResponse struct { func (x *GetAllResponse) Reset() { *x = GetAllResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetAllResponse) String() string { @@ -293,7 +283,7 @@ func (*GetAllResponse) ProtoMessage() {} func (x *GetAllResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -333,11 +323,9 @@ type GetRequest struct { func (x *GetRequest) Reset() { *x = GetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRequest) String() string { @@ -348,7 +336,7 @@ func (*GetRequest) ProtoMessage() {} func (x *GetRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -388,11 +376,9 @@ type GetResponse struct { func (x *GetResponse) Reset() { *x = GetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResponse) String() string { @@ -403,7 +389,7 @@ func (*GetResponse) ProtoMessage() {} func (x *GetResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -443,11 +429,9 @@ type DeleteRequest struct { func (x *DeleteRequest) Reset() { *x = DeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRequest) String() string { @@ -458,7 +442,7 @@ func (*DeleteRequest) ProtoMessage() {} func (x *DeleteRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -497,11 +481,9 @@ type DeleteResponse struct { func (x *DeleteResponse) Reset() { *x = DeleteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteResponse) String() string { @@ -512,7 +494,7 @@ func (*DeleteResponse) ProtoMessage() {} func (x *DeleteResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -546,11 +528,9 @@ type AddRequest struct { func (x *AddRequest) Reset() { *x = AddRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddRequest) String() string { @@ -561,7 +541,7 @@ func (*AddRequest) ProtoMessage() {} func (x *AddRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -607,11 +587,9 @@ type AddResponse struct { func (x *AddResponse) Reset() { *x = AddResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddResponse) String() string { @@ -622,7 +600,7 @@ func (*AddResponse) ProtoMessage() {} func (x *AddResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -654,11 +632,9 @@ type ResetAllSubscriptionsRequest struct { func (x *ResetAllSubscriptionsRequest) Reset() { *x = ResetAllSubscriptionsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResetAllSubscriptionsRequest) String() string { @@ -669,7 +645,7 @@ func (*ResetAllSubscriptionsRequest) ProtoMessage() {} func (x *ResetAllSubscriptionsRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -701,11 +677,9 @@ type ResetAllSubscriptionsResponse struct { func (x *ResetAllSubscriptionsResponse) Reset() { *x = ResetAllSubscriptionsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResetAllSubscriptionsResponse) String() string { @@ -716,7 +690,7 @@ func (*ResetAllSubscriptionsResponse) ProtoMessage() {} func (x *ResetAllSubscriptionsResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -939,164 +913,6 @@ func file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_init() { if File_gosdn_subscriptionmanagement_subscriptionmanagement_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Subscription); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Path); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*SubscribeOptions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetAllRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetAllResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*GetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*GetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*DeleteResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*AddRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*AddResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*ResetAllSubscriptionsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*ResetAllSubscriptionsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/topology/link.pb.go b/api/go/gosdn/topology/link.pb.go index 7eb018808..398feb9d9 100644 --- a/api/go/gosdn/topology/link.pb.go +++ b/api/go/gosdn/topology/link.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/topology/link.proto @@ -41,11 +41,9 @@ type Link struct { func (x *Link) Reset() { *x = Link{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_link_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_link_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Link) String() string { @@ -56,7 +54,7 @@ func (*Link) ProtoMessage() {} func (x *Link) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_link_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -207,20 +205,6 @@ func file_gosdn_topology_link_proto_init() { } file_gosdn_topology_node_proto_init() file_gosdn_topology_port_proto_init() - if !protoimpl.UnsafeEnabled { - file_gosdn_topology_link_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Link); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/topology/node.pb.go b/api/go/gosdn/topology/node.pb.go index cb9e151d9..b65392c17 100644 --- a/api/go/gosdn/topology/node.pb.go +++ b/api/go/gosdn/topology/node.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/topology/node.proto @@ -37,11 +37,9 @@ type Node struct { func (x *Node) Reset() { *x = Node{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_node_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_node_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Node) String() string { @@ -52,7 +50,7 @@ func (*Node) ProtoMessage() {} func (x *Node) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_node_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -148,20 +146,6 @@ func file_gosdn_topology_node_proto_init() { if File_gosdn_topology_node_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_topology_node_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Node); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/topology/port.pb.go b/api/go/gosdn/topology/port.pb.go index 33c0a0df6..de83b8af4 100644 --- a/api/go/gosdn/topology/port.pb.go +++ b/api/go/gosdn/topology/port.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/topology/port.proto @@ -36,11 +36,9 @@ type Configuration struct { func (x *Configuration) Reset() { *x = Configuration{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_port_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_port_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Configuration) String() string { @@ -51,7 +49,7 @@ func (*Configuration) ProtoMessage() {} func (x *Configuration) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_port_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -93,11 +91,9 @@ type Port struct { func (x *Port) Reset() { *x = Port{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_port_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_port_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Port) String() string { @@ -108,7 +104,7 @@ func (*Port) ProtoMessage() {} func (x *Port) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_port_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -224,32 +220,6 @@ func file_gosdn_topology_port_proto_init() { if File_gosdn_topology_port_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_topology_port_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Configuration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_port_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Port); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/topology/route.pb.go b/api/go/gosdn/topology/route.pb.go index 98810c542..9627c2df6 100644 --- a/api/go/gosdn/topology/route.pb.go +++ b/api/go/gosdn/topology/route.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/topology/route.proto @@ -39,11 +39,9 @@ type Route struct { func (x *Route) Reset() { *x = Route{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_route_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_route_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Route) String() string { @@ -54,7 +52,7 @@ func (*Route) ProtoMessage() {} func (x *Route) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_route_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -117,11 +115,9 @@ type RoutingTable struct { func (x *RoutingTable) Reset() { *x = RoutingTable{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_route_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_route_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RoutingTable) String() string { @@ -132,7 +128,7 @@ func (*RoutingTable) ProtoMessage() {} func (x *RoutingTable) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_route_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -252,32 +248,6 @@ func file_gosdn_topology_route_proto_init() { if File_gosdn_topology_route_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_topology_route_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Route); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_route_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*RoutingTable); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/topology/routingTable.pb.go b/api/go/gosdn/topology/routingTable.pb.go index 676faf2c6..1b9638cb3 100644 --- a/api/go/gosdn/topology/routingTable.pb.go +++ b/api/go/gosdn/topology/routingTable.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/topology/routingTable.proto @@ -36,11 +36,9 @@ type AddRoutingTableRequest struct { func (x *AddRoutingTableRequest) Reset() { *x = AddRoutingTableRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_routingTable_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_routingTable_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddRoutingTableRequest) String() string { @@ -51,7 +49,7 @@ func (*AddRoutingTableRequest) ProtoMessage() {} func (x *AddRoutingTableRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_routingTable_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -90,11 +88,9 @@ type AddRoutingTableResponse struct { func (x *AddRoutingTableResponse) Reset() { *x = AddRoutingTableResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_routingTable_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_routingTable_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddRoutingTableResponse) String() string { @@ -105,7 +101,7 @@ func (*AddRoutingTableResponse) ProtoMessage() {} func (x *AddRoutingTableResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_routingTable_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -137,11 +133,9 @@ type GetRoutesRequest struct { func (x *GetRoutesRequest) Reset() { *x = GetRoutesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_routingTable_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_routingTable_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRoutesRequest) String() string { @@ -152,7 +146,7 @@ func (*GetRoutesRequest) ProtoMessage() {} func (x *GetRoutesRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_routingTable_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -185,11 +179,9 @@ type GetRoutesResponse struct { func (x *GetRoutesResponse) Reset() { *x = GetRoutesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_routingTable_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_routingTable_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRoutesResponse) String() string { @@ -200,7 +192,7 @@ func (*GetRoutesResponse) ProtoMessage() {} func (x *GetRoutesResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_routingTable_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -240,11 +232,9 @@ type DeleteRoutesRequest struct { func (x *DeleteRoutesRequest) Reset() { *x = DeleteRoutesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_routingTable_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_routingTable_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRoutesRequest) String() string { @@ -255,7 +245,7 @@ func (*DeleteRoutesRequest) ProtoMessage() {} func (x *DeleteRoutesRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_routingTable_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -294,11 +284,9 @@ type DeleteRoutesResponse struct { func (x *DeleteRoutesResponse) Reset() { *x = DeleteRoutesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_routingTable_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_routingTable_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRoutesResponse) String() string { @@ -309,7 +297,7 @@ func (*DeleteRoutesResponse) ProtoMessage() {} func (x *DeleteRoutesResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_routingTable_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -456,80 +444,6 @@ func file_gosdn_topology_routingTable_proto_init() { } file_gosdn_topology_route_proto_init() file_gosdn_topology_topology_proto_init() - if !protoimpl.UnsafeEnabled { - file_gosdn_topology_routingTable_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*AddRoutingTableRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_routingTable_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*AddRoutingTableResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_routingTable_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*GetRoutesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_routingTable_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetRoutesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_routingTable_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRoutesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_routingTable_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRoutesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/topology/topology.pb.go b/api/go/gosdn/topology/topology.pb.go index 3f0587482..6d85ea4ad 100644 --- a/api/go/gosdn/topology/topology.pb.go +++ b/api/go/gosdn/topology/topology.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/topology/topology.proto @@ -34,11 +34,9 @@ type Topology struct { func (x *Topology) Reset() { *x = Topology{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Topology) String() string { @@ -49,7 +47,7 @@ func (*Topology) ProtoMessage() {} func (x *Topology) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -82,11 +80,9 @@ type AddLinkRequest struct { func (x *AddLinkRequest) Reset() { *x = AddLinkRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddLinkRequest) String() string { @@ -97,7 +93,7 @@ func (*AddLinkRequest) ProtoMessage() {} func (x *AddLinkRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -136,11 +132,9 @@ type AddLinkResponse struct { func (x *AddLinkResponse) Reset() { *x = AddLinkResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddLinkResponse) String() string { @@ -151,7 +145,7 @@ func (*AddLinkResponse) ProtoMessage() {} func (x *AddLinkResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -183,11 +177,9 @@ type GetTopologyRequest struct { func (x *GetTopologyRequest) Reset() { *x = GetTopologyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetTopologyRequest) String() string { @@ -198,7 +190,7 @@ func (*GetTopologyRequest) ProtoMessage() {} func (x *GetTopologyRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -231,11 +223,9 @@ type GetTopologyResponse struct { func (x *GetTopologyResponse) Reset() { *x = GetTopologyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetTopologyResponse) String() string { @@ -246,7 +236,7 @@ func (*GetTopologyResponse) ProtoMessage() {} func (x *GetTopologyResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -286,11 +276,9 @@ type UpdateLinkRequest struct { func (x *UpdateLinkRequest) Reset() { *x = UpdateLinkRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateLinkRequest) String() string { @@ -301,7 +289,7 @@ func (*UpdateLinkRequest) ProtoMessage() {} func (x *UpdateLinkRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -340,11 +328,9 @@ type UpdateLinkResponse struct { func (x *UpdateLinkResponse) Reset() { *x = UpdateLinkResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateLinkResponse) String() string { @@ -355,7 +341,7 @@ func (*UpdateLinkResponse) ProtoMessage() {} func (x *UpdateLinkResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -388,11 +374,9 @@ type DeleteLinkRequest struct { func (x *DeleteLinkRequest) Reset() { *x = DeleteLinkRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteLinkRequest) String() string { @@ -403,7 +387,7 @@ func (*DeleteLinkRequest) ProtoMessage() {} func (x *DeleteLinkRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -442,11 +426,9 @@ type DeleteLinkResponse struct { func (x *DeleteLinkResponse) Reset() { *x = DeleteLinkResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_topology_topology_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_topology_topology_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteLinkResponse) String() string { @@ -457,7 +439,7 @@ func (*DeleteLinkResponse) ProtoMessage() {} func (x *DeleteLinkResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_topology_topology_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -624,116 +606,6 @@ func file_gosdn_topology_topology_proto_init() { } file_gosdn_topology_link_proto_init() file_gosdn_topology_route_proto_init() - if !protoimpl.UnsafeEnabled { - file_gosdn_topology_topology_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*Topology); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*AddLinkRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*AddLinkResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetTopologyRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetTopologyResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*UpdateLinkRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*UpdateLinkResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*DeleteLinkRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_topology_topology_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*DeleteLinkResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/go/gosdn/transport/transport.pb.go b/api/go/gosdn/transport/transport.pb.go index 745f907d3..24ebcfbe0 100644 --- a/api/go/gosdn/transport/transport.pb.go +++ b/api/go/gosdn/transport/transport.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc (unknown) // source: gosdn/transport/transport.proto @@ -42,11 +42,9 @@ type TransportOption struct { func (x *TransportOption) Reset() { *x = TransportOption{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_transport_transport_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_transport_transport_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TransportOption) String() string { @@ -57,7 +55,7 @@ func (*TransportOption) ProtoMessage() {} func (x *TransportOption) ProtoReflect() protoreflect.Message { mi := &file_gosdn_transport_transport_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -157,11 +155,9 @@ type GnmiTransportOption struct { func (x *GnmiTransportOption) Reset() { *x = GnmiTransportOption{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_transport_transport_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_transport_transport_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GnmiTransportOption) String() string { @@ -172,7 +168,7 @@ func (*GnmiTransportOption) ProtoMessage() {} func (x *GnmiTransportOption) ProtoReflect() protoreflect.Message { mi := &file_gosdn_transport_transport_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -223,11 +219,9 @@ type RestconfTransportOption struct { func (x *RestconfTransportOption) Reset() { *x = RestconfTransportOption{} - if protoimpl.UnsafeEnabled { - mi := &file_gosdn_transport_transport_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_gosdn_transport_transport_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RestconfTransportOption) String() string { @@ -238,7 +232,7 @@ func (*RestconfTransportOption) ProtoMessage() {} func (x *RestconfTransportOption) ProtoReflect() protoreflect.Message { mi := &file_gosdn_transport_transport_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -356,44 +350,6 @@ func file_gosdn_transport_transport_proto_init() { if File_gosdn_transport_transport_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_gosdn_transport_transport_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*TransportOption); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_transport_transport_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*GnmiTransportOption); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gosdn_transport_transport_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*RestconfTransportOption); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_gosdn_transport_transport_proto_msgTypes[0].OneofWrappers = []any{ (*TransportOption_GnmiTransportOption)(nil), (*TransportOption_RestconfTransportOption)(nil), diff --git a/api/openapiv2/gosdn_northbound.swagger.json b/api/openapiv2/gosdn_northbound.swagger.json index 7e1d7500d..faefcc2b9 100644 --- a/api/openapiv2/gosdn_northbound.swagger.json +++ b/api/openapiv2/gosdn_northbound.swagger.json @@ -1704,6 +1704,45 @@ "UserService" ] } + }, + "/yang/parse": { + "get": { + "summary": "Allows to request a specific Managed Network Element which is managed by a\nspecific Principal Network Domain.", + "operationId": "NetworkElementService_ParseYang", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/networkelementParseYangResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "timestamp", + "description": "Timestamp in nanoseconds since Epoch.", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + }, + { + "name": "yang", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "NetworkElementService" + ] + } } }, "definitions": { @@ -3562,6 +3601,19 @@ } } }, + "networkelementParseYangResponse": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "int64", + "description": "Timestamp in nanoseconds since Epoch." + }, + "json": { + "type": "string" + } + } + }, "networkelementSetChange": { "type": "object", "properties": { diff --git a/api/proto/buf.lock b/api/proto/buf.lock index 0e5e89005..e84d9ee54 100644 --- a/api/proto/buf.lock +++ b/api/proto/buf.lock @@ -4,15 +4,15 @@ deps: - remote: buf.build owner: bufbuild repository: protovalidate - commit: e097f827e65240ac9fd4b1158849a8fc - digest: shake256:f19252436fd9ded945631e2ffaaed28247a92c9015ccf55ae99db9fb3d9600c4fdb00fd2d3bd7701026ec2fd4715c5129e6ae517c25a59ba690020cfe80bf8ad + commit: 5a7b106cbb87462d9a8c9ffecdbd2e38 + digest: shake256:2f7efa5a904668219f039d4f6eeb51e871f8f7f5966055a10663cba335bd65f76cac84da3fa758ab7b5dcb489ec599521390ce3951d119fb56df1fc2def16bb0 - remote: buf.build owner: googleapis repository: googleapis - commit: a86849a25cc04f4dbe9b15ddddfbc488 - digest: shake256:e19143328f8cbfe13fc226aeee5e63773ca494693a72740a7560664270039a380d94a1344234b88c7691311460df9a9b1c2982190d0a2612eae80368718e1943 + commit: f52d4f76a8434cc5966798b1d3b4f110 + digest: shake256:71566dd80e39b7d85fdaa9b7f82107385181d5b6d17ea56c0aacce61099b35f9f1bcf7333ad9838ca19d24d7f076b039de7c9c09c55d23bb4c2fddfceff4d2c2 - remote: buf.build owner: grpc-ecosystem repository: grpc-gateway - commit: 3f42134f4c564983838425bc43c7a65f - digest: shake256:3d11d4c0fe5e05fda0131afefbce233940e27f0c31c5d4e385686aea58ccd30f72053f61af432fa83f1fc11cda57f5f18ca3da26a29064f73c5a0d076bba8d92 + commit: a48fcebcf8f140dd9d09359b9bb185a4 + digest: shake256:a926173f0ec3e1a929462c350acda846e546134b5ce2bb83fe44f02f9330a42b1c9b292f64b951b06a4d2c47e2ce4d477d6a2cb31502a15637ada35ecedefcf6 diff --git a/api/proto/gosdn/networkelement/networkelement.proto b/api/proto/gosdn/networkelement/networkelement.proto index 9c83e2fef..b2a14817b 100644 --- a/api/proto/gosdn/networkelement/networkelement.proto +++ b/api/proto/gosdn/networkelement/networkelement.proto @@ -44,6 +44,13 @@ service NetworkElementService { option (google.api.http) = {get: "/mnes/{mneid}"}; } + + // Allows to request a specific Managed Network Element which is managed by a + // specific Principal Network Domain. + rpc ParseYang(ParseYangRequest) returns (ParseYangResponse) { + option (google.api.http) = {get: "/yang/parse"}; + } + // TODO: add http option // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. A flattened version of a Managed @@ -170,6 +177,18 @@ message GetAllFlattenedResponse { repeated FlattenedManagedNetworkElement mne = 3; } +message ParseYangRequest { + int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. + string yang = 2 [(buf.validate.field).required = true]; +} + + +message ParseYangResponse { + int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. + string json = 2 [(buf.validate.field).required = true]; +} + + message GetRequest { int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. string mneid = 2 [(buf.validate.field).required = true]; diff --git a/controller/controller.go b/controller/controller.go index a1a24aaf6..32adf3586 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -346,6 +346,7 @@ func ensureAdminRoleExists() error { "/gosdn.networkelement.NetworkElementService/DeviceSchema", "/gosdn.networkelement.NetworkElementService/Delete", "/gosdn.networkelement.NetworkElementService/SubscribePath", + "/gosdn.networkelement.NetworkElementService/ParseYang", "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins", "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema", "/gosdn.app.AppService/Register", diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go index 4a3db1c4f..10312d0f9 100644 --- a/controller/northbound/server/networkElement.go +++ b/controller/northbound/server/networkElement.go @@ -20,6 +20,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" + "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" util "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/gnmi" "code.fbi.h-da.de/danet/gosdn/controller/store" aGNMI "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" @@ -182,6 +183,37 @@ func (n *NetworkElementServer) GetFlattened(ctx context.Context, request *mnepb. }, nil } +func (n *NetworkElementServer) ParseYang(ctx context.Context, request *mnepb.ParseYangRequest) (*mnepb.ParseYangResponse, error) { + if err := n.protoValidator.Validate(request); err != nil { + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + device := &openconfig.Device{} + + if err := openconfig.Unmarshal([]byte(request.Yang), device); err != nil { + log.Error(err) + return nil, err + } + + json, err := ygot.EmitJSON(device, &ygot.EmitJSONConfig{ + Format: ygot.RFC7951, + Indent: " ", + RFC7951Config: &ygot.RFC7951JSONConfig{ + AppendModuleName: true, + }, + }) + + if err != nil { + log.Error(err) + return nil, err + } + + return &mnepb.ParseYangResponse{ + Timestamp: time.Now().UnixNano(), + Json: string(json), + }, nil +} + func (n *NetworkElementServer) getMne(identifier string) (networkelement.NetworkElement, error) { id, err := uuid.Parse(identifier) if err != nil { diff --git a/react-ui/scripts/openapi-config.json b/react-ui/scripts/openapi-config.json index dbb9a84af..e999a3cf7 100644 --- a/react-ui/scripts/openapi-config.json +++ b/react-ui/scripts/openapi-config.json @@ -1,11 +1,11 @@ { - "schemaFile": "../../api/openapiv2/gosdn_northbound.swagger.json", - "apiFile": "../src/stores/api.store.ts", - "apiImport": "emptySplitApi", - "outputFile": "../src/api/api.ts", - "exportName": "api", - "hooks": true, - "nullSafeAdditionalProps": true, - "withInterfaces": true, - "tag": true -} \ No newline at end of file + "schemaFile": "../../api/openapiv2/gosdn_northbound.swagger.json", + "apiFile": "../src/stores/api.store.ts", + "apiImport": "emptySplitApi", + "outputFile": "../src/shared/api/api.ts", + "exportName": "api", + "hooks": true, + "nullSafeAdditionalProps": true, + "withInterfaces": true, + "tag": true +} diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index 7195ceaa1..8e4454bd2 100644 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -1,21 +1,29 @@ -import { api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain, PndServiceGetPndListApiArg } from '@api/api'; -import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs'; -import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; -import '../routines/index'; - - -export type Device = NetworkelementFlattenedManagedNetworkElement; +import { + api, + NetworkelementFlattenedManagedNetworkElement, + NetworkelementManagedNetworkElement, + PndPrincipalNetworkDomain, + PndServiceGetPndListApiArg, +} from '@api/api' +import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs' +import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit' +import { RootState } from 'src/stores' +import '../routines/index' +import { startListening } from '/src/stores/middleware/listener.middleware' + +export type Device = NetworkelementFlattenedManagedNetworkElement interface SelectedDeviceInterface { - device: Device, + device: Device mne: NetworkelementManagedNetworkElement | null + json: JSON | null } -type SelectedDeviceType = SelectedDeviceInterface | undefined; +type SelectedDeviceType = SelectedDeviceInterface | null export interface DeviceSliceState { - devices: Device[], - pnds: PndPrincipalNetworkDomain[], + devices: Device[] + pnds: PndPrincipalNetworkDomain[] activeTab: DeviceViewTabValues selectedDevice: SelectedDeviceType @@ -25,44 +33,75 @@ const initialState: DeviceSliceState = { devices: [], pnds: [], activeTab: DeviceViewTabValues.METADATA, - selectedDevice: null + selectedDevice: null, } const deviceSlice = createSlice({ name: 'device', initialState, reducers: { - setDevices: (state, action: PayloadAction<Device[]>) => { state.devices = action.payload }, - setPnds: (state, action: PayloadAction<PndPrincipalNetworkDomain[]>) => { state.pnds = action.payload }, - setActiveTab: (state, action: PayloadAction<DeviceViewTabValues>) => { state.activeTab = action.payload }, - setSelectedDevice: (state, action: PayloadAction<Device | null>) => { - let selectedDevice: SelectedDeviceType; + setDevices: (state, action: PayloadAction<Device[]>) => { + state.devices = action.payload + }, + setPnds: (state, action: PayloadAction<PndPrincipalNetworkDomain[]>) => { + state.pnds = action.payload + }, + setActiveTab: (state, action: PayloadAction<DeviceViewTabValues>) => { + state.activeTab = action.payload + }, + setSelectedDevice: (state, action: PayloadAction<Device | null>) => { + let selectedDevice: SelectedDeviceType = null if (action.payload) { - selectedDevice = {device: action.payload, mne: null}; + selectedDevice = { device: action.payload, mne: null, json: null } } - state.selectedDevice = selectedDevice; + state.selectedDevice = selectedDevice + }, + setSelectedMne: (state, action: PayloadAction<NetworkelementManagedNetworkElement>) => { + if (!state.selectedDevice) { + throw new Error('Selected Device is null where it shouldn´t be null') + } + + state.selectedDevice.mne = action.payload + // TODO maybe don´t take the device of "selected device" instead search in the devices array for the proper device + // should not make a diffrence due to pointer but dunno + }, + + setSelectedJson: (state, action: PayloadAction<JSON>) => { + if (!state.selectedDevice) { + throw new Error('Selected Device is null where it shouldn´t be null') + } + + state.selectedDevice.json = action.payload || null }, - setSelectedMne: (state, action: PayloadAction<NetworkelementManagedNetworkElement>) => { state.selectedDevice.mne = action.payload }, }, }) -export const { setDevices, setActiveTab, setSelectedDevice, setSelectedMne } = deviceSlice.actions +export const { setDevices, setActiveTab, setSelectedDevice, setSelectedMne, setSelectedJson } = + deviceSlice.actions const { setPnds } = deviceSlice.actions export default deviceSlice.reducer -export const deviceReducerPath = deviceSlice.reducerPath; - - +export const deviceReducerPath = deviceSlice.reducerPath export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { const payload: PndServiceGetPndListApiArg = { timestamp: new Date().getTime().toString(), } - const subscription = thunkApi.dispatch(api.endpoints.pndServiceGetPndList.initiate(payload)); + const subscription = thunkApi.dispatch(api.endpoints.pndServiceGetPndList.initiate(payload)) subscription.unwrap().then((response) => { - thunkApi.dispatch(setPnds(response.pnd)); - }); -}); + thunkApi.dispatch(setPnds(response.pnd)) + }) +}) +// add default selected device if no selected device is set +startListening({ + predicate: (action) => setDevices.match(action), + effect: async (action, listenerApi) => { + const { device } = listenerApi.getOriginalState() as RootState + if (!device.selectedDevice && !!action.payload[0]) { + listenerApi.dispatch(setSelectedDevice(action.payload[0])) + } + }, +}) diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts index 9823aa69a..378e6e8cf 100644 --- a/react-ui/src/components/devices/routines/mne.routine.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -1,46 +1,82 @@ -import { api, NetworkElementServiceGetApiArg } from "@api/api"; -import { Device, setSelectedDevice, setSelectedMne } from "@component/devices/reducer/device.reducer"; -import { createAsyncThunk } from "@reduxjs/toolkit"; -import { addRoutine, CATEGORIES } from "@shared/reducer/routine.reducer"; -import { RootState } from "src/stores"; -import { startListening } from "../../../stores/middleware/listener.middleware"; - -export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE'; +import { api, NetworkElementServiceGetApiArg, NetworkElementServiceParseYangApiArg } from '@api/api' +import { + Device, + setSelectedDevice, + setSelectedJson, + setSelectedMne, +} from '@component/devices/reducer/device.reducer' +import { createAsyncThunk } from '@reduxjs/toolkit' +import { addRoutine, CATEGORIES } from '@shared/reducer/routine.reducer' +import { RootState } from 'src/stores' +import { startListening } from '../../../stores/middleware/listener.middleware' +export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE' // fetch mne if selected device is set startListening({ predicate: (action) => setSelectedDevice.match(action) && !!action.payload, effect: async (action, listenerApi) => { - listenerApi.dispatch(addRoutine({thunk: fetchSelectedMneThunk, category: CATEGORIES.TAB, payload: action.payload})); + listenerApi.dispatch( + addRoutine({ + thunk: fetchSelectedMneThunk, + category: CATEGORIES.TAB, + payload: action.payload, + }) + ) }, }) +const FETCH_MNE_INTERVAL = 5000 // in ms +export const fetchSelectedMneThunk = createAsyncThunk( + FETCH_MNE_ACTION, + async (device: Device, thunkApi) => { + const { user } = thunkApi.getState() as RootState -const FETCH_MNE_INTERVAL = 5000; // in ms -export const fetchSelectedMneThunk = createAsyncThunk(FETCH_MNE_ACTION, async (device: Device, thunkApi) => { - const { user } = thunkApi.getState() as RootState; - - const payload: NetworkElementServiceGetApiArg = { - pid: Object.keys(user?.user.roles)[0], - timestamp: new Date().getTime().toString(), - mneid: device.id, - } - - const subscription = thunkApi.dispatch(api.endpoints.networkElementServiceGet.initiate(payload, { - subscriptionOptions: { - pollingInterval: FETCH_MNE_INTERVAL, - skipPollingIfUnfocused: true, + const payload: NetworkElementServiceGetApiArg = { + pid: Object.keys(user?.user.roles)[0], + timestamp: new Date().getTime().toString(), + mneid: device.id, } - })); - return {...subscription}; -}); + const subscription = thunkApi.dispatch( + api.endpoints.networkElementServiceGet.initiate(payload, { + subscriptionOptions: { + pollingInterval: FETCH_MNE_INTERVAL, + skipPollingIfUnfocused: true, + }, + }) + ) + + return { ...subscription } + } +) // save fetched mne startListening({ predicate: (action) => api.endpoints.networkElementServiceGet.matchFulfilled(action), effect: async (action, listenerApi) => { - listenerApi.dispatch(setSelectedMne(action.payload.mne)); + listenerApi.dispatch(setSelectedMne(action.payload.mne)) + }, +}) + +// save fetched mne +startListening({ + predicate: (action) => setSelectedMne.match(action), + effect: async (action, listenerApi) => { + const payload: NetworkElementServiceParseYangApiArg = { + timestamp: new Date().getTime().toString(), + yang: action.payload.model, + } + + const { data } = await listenerApi.dispatch( + api.endpoints.networkElementServiceParseYang.initiate(payload) + ) + + if (!data?.json) { + throw new Error('ParseYang response is invalid. The json field is null') + } + const json = JSON.parse(data.json) + + listenerApi.dispatch(setSelectedJson(json)) }, -}) \ No newline at end of file +}) diff --git a/react-ui/src/components/devices/view/device.scss b/react-ui/src/components/devices/view/device.scss index 0890fc928..afebc6fe5 100644 --- a/react-ui/src/components/devices/view/device.scss +++ b/react-ui/src/components/devices/view/device.scss @@ -6,6 +6,17 @@ thead { tr:hover > td { background-color: lighten(map-get($theme-colors, primary), 30%) !important; + cursor: pointer; +} + +tr.active > td { + background-color: lighten(map-get($theme-colors, primary), 5%) !important; + + color: map-get($theme-colors, 'black') !important; +} + +tr > td { + color: map-get($theme-colors, 'dark') !important; } tr:nth-child(2n + 1) > td { diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index 9ef441f17..933b50a8a 100644 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -5,9 +5,9 @@ import { useTranslation } from "react-i18next"; import { useDeviceTableViewModel } from "../view_model/device.table.viewmodel"; export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { - const { devices, pnds } = useAppSelector(state => state.device); + const { devices, pnds, selectedDevice } = useAppSelector(state => state.device); const { t } = useTranslation('common'); - const { searchTerm, trClickHandler } = useDeviceTableViewModel(searchRef); + const { trClickHandler } = useDeviceTableViewModel(searchRef); const cropUUID = (uuid: string): string => { @@ -28,7 +28,7 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = const user = pnds.find(pnd => pnd.id === device.pid); return ( - <tr key={index} onClick={() => trClickHandler(device)}> + <tr key={index} onClick={() => trClickHandler(device)} className={selectedDevice?.device.id === device.id ? 'active' : ''}> <td>{device.name}</td> <OverlayTrigger overlay={<Tooltip id={device.id}>{device.id}</Tooltip>}> <td>{cropUUID(device.id)}</td> @@ -38,7 +38,7 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = </tr> ) }) - }, [searchTerm, devices, pnds]); + }, [devices, searchRef, pnds, selectedDevice, trClickHandler]); return ( diff --git a/react-ui/src/components/devices/view/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx index 95796741a..05e854651 100644 --- a/react-ui/src/components/devices/view/device.view.tabs.tsx +++ b/react-ui/src/components/devices/view/device.view.tabs.tsx @@ -22,8 +22,8 @@ export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { const yangModelTab = () => { return ( <> - {yang.current && - <ReactJson src={yang.current} name={false} collapsed={false} quotesOnKeys={false} /> + {selectedDevice?.json && + <ReactJson src={selectedDevice.json} name={false} collapsed={false} quotesOnKeys={false} /> } </> ); diff --git a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts index f9d3124ea..e15f7c721 100644 --- a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts @@ -19,9 +19,11 @@ export const useDeviceTabsViewModel = () => { return } - parse(serializedYang).then((json) => { - yang.current = json - }) + console.log(serializedYang) + + // parse(serializedYang).then((json) => { + // yang.current = json + // }) }, [selectedDevice, parse]) return { diff --git a/react-ui/src/components/devices/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts index cfff6cf9a..9a0fbe17a 100644 --- a/react-ui/src/components/devices/view_model/device.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.viewmodel.ts @@ -1,23 +1,25 @@ -import { setActiveTab as setActiveTabState } from "@component/devices/reducer/device.reducer"; -import { useAppDispatch, useAppSelector } from "@hooks"; -import { DeviceViewTabValues } from "@view/device/device.view.tabs"; +import { setActiveTab as setActiveTabState } from '@component/devices/reducer/device.reducer' +import { useAppDispatch, useAppSelector } from '@hooks' +import { DeviceViewTabValues } from '@view/device/device.view.tabs' +import { useEffect } from 'react' export const useDeviceViewModel = () => { - const {activeTab} = useAppSelector(state => state.device); - const dispatch = useAppDispatch(); - + const { activeTab } = useAppSelector((state) => state.device) + const dispatch = useAppDispatch() + + useEffect(() => {}, []) + const handleActiveTabLink = (tabLink: DeviceViewTabValues) => { - return activeTab === tabLink ? 'active' : ''; + return activeTab === tabLink ? 'active' : '' } const setActiveTab = (tab: DeviceViewTabValues) => { - dispatch(setActiveTabState(tab)); + dispatch(setActiveTabState(tab)) } - return { activeTab, setActiveTab, - handleActiveTabLink + handleActiveTabLink, } -} \ No newline at end of file +} diff --git a/react-ui/src/shared/api/api.ts b/react-ui/src/shared/api/api.ts index a5d1ebd6b..c964d9dc9 100644 --- a/react-ui/src/shared/api/api.ts +++ b/react-ui/src/shared/api/api.ts @@ -7,6 +7,7 @@ export const addTagTypes = [ 'PndService', 'RoleService', 'RoutingTableService', + 'SubscriptionManagementService', 'TopologyService', 'UserService', ] as const @@ -51,10 +52,7 @@ const injectedRtkApi = api }), invalidatesTags: ['ConfigurationManagementService'], }), - authServiceLogin: build.mutation< - AuthServiceLoginApiResponse, - AuthServiceLoginApiArg - >({ + authServiceLogin: build.mutation<AuthServiceLoginApiResponse, AuthServiceLoginApiArg>({ query: (queryArg) => ({ url: `/login`, method: 'POST', @@ -79,10 +77,7 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes`, - params: { - timestamp: queryArg.timestamp, - pid: queryArg.pid, - }, + params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, }), providesTags: ['NetworkElementService'], }), @@ -103,10 +98,7 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/changes`, - params: { - timestamp: queryArg.timestamp, - pid: queryArg.pid, - }, + params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, }), providesTags: ['NetworkElementService'], }), @@ -127,10 +119,7 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/changes/${queryArg.cuid}`, - params: { - timestamp: queryArg.timestamp, - pid: queryArg.pid, - }, + params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, }), providesTags: ['NetworkElementService'], }), @@ -151,10 +140,7 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}`, - params: { - timestamp: queryArg.timestamp, - pid: queryArg.pid, - }, + params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, }), providesTags: ['NetworkElementService'], }), @@ -165,10 +151,7 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}`, method: 'DELETE', - params: { - timestamp: queryArg.timestamp, - pid: queryArg.pid, - }, + params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, }), invalidatesTags: ['NetworkElementService'], }), @@ -178,10 +161,7 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}/intendedpaths/${queryArg.intendedPath}`, - params: { - timestamp: queryArg.timestamp, - pid: queryArg.pid, - }, + params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, }), providesTags: ['NetworkElementService'], }), @@ -191,10 +171,7 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}/paths/${queryArg.path}`, - params: { - timestamp: queryArg.timestamp, - pid: queryArg.pid, - }, + params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, }), providesTags: ['NetworkElementService'], }), @@ -209,10 +186,7 @@ const injectedRtkApi = api }), invalidatesTags: ['NetworkElementService'], }), - pndServiceGetPnd: build.query< - PndServiceGetPndApiResponse, - PndServiceGetPndApiArg - >({ + pndServiceGetPnd: build.query<PndServiceGetPndApiResponse, PndServiceGetPndApiArg>({ query: (queryArg) => ({ url: `/pnd/${queryArg.pid}`, params: { timestamp: queryArg.timestamp }, @@ -223,10 +197,7 @@ const injectedRtkApi = api PndServiceGetPndListApiResponse, PndServiceGetPndListApiArg >({ - query: (queryArg) => ({ - url: `/pnds`, - params: { timestamp: queryArg.timestamp }, - }), + query: (queryArg) => ({ url: `/pnds`, params: { timestamp: queryArg.timestamp } }), providesTags: ['PndService'], }), pndServiceCreatePndList: build.mutation< @@ -266,10 +237,7 @@ const injectedRtkApi = api RoleServiceGetRolesApiResponse, RoleServiceGetRolesApiArg >({ - query: (queryArg) => ({ - url: `/roles`, - params: { timestamp: queryArg.timestamp }, - }), + query: (queryArg) => ({ url: `/roles`, params: { timestamp: queryArg.timestamp } }), providesTags: ['RoleService'], }), roleServiceCreateRoles: build.mutation< @@ -290,10 +258,7 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/roles/delete`, method: 'DELETE', - params: { - timestamp: queryArg.timestamp, - roleName: queryArg.roleName, - }, + params: { timestamp: queryArg.timestamp, roleName: queryArg.roleName }, }), invalidatesTags: ['RoleService'], }), @@ -369,6 +334,58 @@ const injectedRtkApi = api }), invalidatesTags: ['RoutingTableService'], }), + subscriptionManagementServiceResetAllSubscriptions: build.query< + SubscriptionManagementServiceResetAllSubscriptionsApiResponse, + SubscriptionManagementServiceResetAllSubscriptionsApiArg + >({ + query: (queryArg) => ({ + url: `/submanagement/reset`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['SubscriptionManagementService'], + }), + subscriptionManagementServiceGetAll: build.query< + SubscriptionManagementServiceGetAllApiResponse, + SubscriptionManagementServiceGetAllApiArg + >({ + query: (queryArg) => ({ + url: `/submanagement/subscriptions`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['SubscriptionManagementService'], + }), + subscriptionManagementServiceAdd: build.mutation< + SubscriptionManagementServiceAddApiResponse, + SubscriptionManagementServiceAddApiArg + >({ + query: (queryArg) => ({ + url: `/submanagement/${queryArg.mneid}`, + method: 'POST', + body: queryArg.subscriptionmanagementSubscriptionManagementServiceAddBody, + }), + invalidatesTags: ['SubscriptionManagementService'], + }), + subscriptionManagementServiceGet: build.query< + SubscriptionManagementServiceGetApiResponse, + SubscriptionManagementServiceGetApiArg + >({ + query: (queryArg) => ({ + url: `/submanagement/${queryArg.subid}`, + params: { timestamp: queryArg.timestamp }, + }), + providesTags: ['SubscriptionManagementService'], + }), + subscriptionManagementServiceDelete: build.mutation< + SubscriptionManagementServiceDeleteApiResponse, + SubscriptionManagementServiceDeleteApiArg + >({ + query: (queryArg) => ({ + url: `/submanagement/${queryArg.subid}`, + method: 'DELETE', + params: { timestamp: queryArg.timestamp }, + }), + invalidatesTags: ['SubscriptionManagementService'], + }), topologyServiceGetTopology: build.query< TopologyServiceGetTopologyApiResponse, TopologyServiceGetTopologyApiArg @@ -416,10 +433,7 @@ const injectedRtkApi = api UserServiceGetUsersApiResponse, UserServiceGetUsersApiArg >({ - query: (queryArg) => ({ - url: `/users`, - params: { timestamp: queryArg.timestamp }, - }), + query: (queryArg) => ({ url: `/users`, params: { timestamp: queryArg.timestamp } }), providesTags: ['UserService'], }), userServiceCreateUsers: build.mutation< @@ -440,10 +454,7 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/users/delete`, method: 'DELETE', - params: { - timestamp: queryArg.timestamp, - username: queryArg.username, - }, + params: { timestamp: queryArg.timestamp, username: queryArg.username }, }), invalidatesTags: ['UserService'], }), @@ -453,11 +464,7 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/users/get`, - params: { - timestamp: queryArg.timestamp, - name: queryArg.name, - id: queryArg.id, - }, + params: { timestamp: queryArg.timestamp, name: queryArg.name, id: queryArg.id }, }), providesTags: ['UserService'], }), @@ -472,6 +479,16 @@ const injectedRtkApi = api }), invalidatesTags: ['UserService'], }), + networkElementServiceParseYang: build.query< + NetworkElementServiceParseYangApiResponse, + NetworkElementServiceParseYangApiArg + >({ + query: (queryArg) => ({ + url: `/yang/parse`, + params: { timestamp: queryArg.timestamp, yang: queryArg.yang }, + }), + providesTags: ['NetworkElementService'], + }), }), overrideExisting: false, }) @@ -496,8 +513,7 @@ export type ConfigurationManagementServiceImportSdnConfigApiArg = { timestamp?: string sdnConfigData?: string } -export type AuthServiceLoginApiResponse = - /** status 200 A successful response. */ RbacLoginResponse +export type AuthServiceLoginApiResponse = /** status 200 A successful response. */ RbacLoginResponse export type AuthServiceLoginApiArg = { rbacLoginRequest: Login } @@ -582,8 +598,7 @@ export type NetworkElementServiceUpdateApiResponse = export type NetworkElementServiceUpdateApiArg = { networkelementUpdateNetworkElementRequest: TodoChangeNameToFitTheRest } -export type PndServiceGetPndApiResponse = - /** status 200 A successful response. */ PndGetPndResponse +export type PndServiceGetPndApiResponse = /** status 200 A successful response. */ PndGetPndResponse export type PndServiceGetPndApiArg = { pid: string /** Timestamp in nanoseconds since Epoch. */ @@ -663,6 +678,34 @@ export type RoutingTableServiceDeleteRouteApiArg = { timestamp?: string id?: string } +export type SubscriptionManagementServiceResetAllSubscriptionsApiResponse = + /** status 200 A successful response. */ SubscriptionmanagementResetAllSubscriptionsResponse +export type SubscriptionManagementServiceResetAllSubscriptionsApiArg = { + timestamp?: string +} +export type SubscriptionManagementServiceGetAllApiResponse = + /** status 200 A successful response. */ GosdnsubscriptionmanagementGetAllResponse +export type SubscriptionManagementServiceGetAllApiArg = { + timestamp?: string +} +export type SubscriptionManagementServiceAddApiResponse = + /** status 200 A successful response. */ SubscriptionmanagementAddResponse +export type SubscriptionManagementServiceAddApiArg = { + mneid: string + subscriptionmanagementSubscriptionManagementServiceAddBody: SubscriptionmanagementSubscriptionManagementServiceAddBody +} +export type SubscriptionManagementServiceGetApiResponse = + /** status 200 A successful response. */ GosdnsubscriptionmanagementGetResponse +export type SubscriptionManagementServiceGetApiArg = { + subid: string + timestamp?: string +} +export type SubscriptionManagementServiceDeleteApiResponse = + /** status 200 A successful response. */ GosdnsubscriptionmanagementDeleteResponse +export type SubscriptionManagementServiceDeleteApiArg = { + subid: string + timestamp?: string +} export type TopologyServiceGetTopologyApiResponse = /** status 200 A successful response. */ TopologyGetTopologyResponse export type TopologyServiceGetTopologyApiArg = { @@ -713,6 +756,13 @@ export type UserServiceUpdateUsersApiResponse = export type UserServiceUpdateUsersApiArg = { rbacUpdateUsersRequest: UpdateUsers } +export type NetworkElementServiceParseYangApiResponse = + /** status 200 A successful response. */ NetworkelementParseYangResponse +export type NetworkElementServiceParseYangApiArg = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + yang?: string +} export type AppAppDeregisterResponse = { timestamp?: string } @@ -817,11 +867,10 @@ export type TransportGnmiTransportOption = { } export type TransportRestconfTransportOption = object export type ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums = - - | 'TYPE_UNSPECIFIED' - | 'TYPE_OPENCONFIG' - | 'TYPE_CONTAINERISED' - | 'TYPE_PLUGIN' + | 'TYPE_UNSPECIFIED' + | 'TYPE_OPENCONFIG' + | 'TYPE_CONTAINERISED' + | 'TYPE_PLUGIN' export type TransportTransportOption = { address?: string username?: string @@ -1147,6 +1196,43 @@ export type TopologyAddRoutingTableRequest = { export type TopologyDeleteRoutesResponse = { timestamp?: string } +export type SubscriptionmanagementResetAllSubscriptionsResponse = { + timestamp?: string +} +export type GosdnsubscriptionmanagementPath = { + elem?: string[] +} +export type SubscriptionmanagementSubscribeOptions = { + gnmiMode?: string + gnmiStreamMode?: string + sampleInterval?: string +} +export type GosdnsubscriptionmanagementSubscription = { + subid?: string + pid?: string + mneid?: string + mneName?: string + paths?: GosdnsubscriptionmanagementPath[] + subscribeOptions?: SubscriptionmanagementSubscribeOptions +} +export type GosdnsubscriptionmanagementGetAllResponse = { + timestamp?: string + subscriptions?: GosdnsubscriptionmanagementSubscription[] +} +export type SubscriptionmanagementAddResponse = { + timestamp?: string +} +export type SubscriptionmanagementSubscriptionManagementServiceAddBody = { + timestamp?: string + subscription?: GosdnsubscriptionmanagementSubscription +} +export type GosdnsubscriptionmanagementGetResponse = { + timestamp?: string + subscriptions?: GosdnsubscriptionmanagementSubscription +} +export type GosdnsubscriptionmanagementDeleteResponse = { + timestamp?: string +} export type TopologyNode = { id?: string name?: string @@ -1240,6 +1326,11 @@ export type UpdateUsers = { timestamp?: string user?: RbacUpdateUser[] } +export type NetworkelementParseYangResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + json?: string +} export const { useAppServiceDeregisterMutation, useConfigurationManagementServiceExportSdnConfigQuery, @@ -1271,6 +1362,11 @@ export const { useRoutingTableServiceGetRoutesQuery, useRoutingTableServiceAddRoutingTableMutation, useRoutingTableServiceDeleteRouteMutation, + useSubscriptionManagementServiceResetAllSubscriptionsQuery, + useSubscriptionManagementServiceGetAllQuery, + useSubscriptionManagementServiceAddMutation, + useSubscriptionManagementServiceGetQuery, + useSubscriptionManagementServiceDeleteMutation, useTopologyServiceGetTopologyQuery, useTopologyServiceAddLinkMutation, useTopologyServiceDeleteLinkMutation, @@ -1280,4 +1376,5 @@ export const { useUserServiceDeleteUsersMutation, useUserServiceGetUserQuery, useUserServiceUpdateUsersMutation, + useNetworkElementServiceParseYangQuery, } = injectedRtkApi diff --git a/react-ui/src/shared/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx index 4098eca5b..faf29847f 100644 --- a/react-ui/src/shared/provider/auth.provider.tsx +++ b/react-ui/src/shared/provider/auth.provider.tsx @@ -30,19 +30,18 @@ const AuthContext = createContext<AuthProviderType>({ }); export const AuthProvider = ({ children }) => { - const dispatch = useAppDispatch();; - const navigate = useNavigate(); - const { username } = useAppSelector(state => state.user); + const dispatch = useAppDispatch() + const navigate = useNavigate() + const { username } = useAppSelector(state => state.user) useEffect(() => { const token = getCookieValue('token'); - if (token) { - navigate(DEVICE_URL) - } else { + if (!token) { navigate(LOGIN_URL) } - }, [username]); + + }, [username, navigate]); const [ sendLogin, diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index 4cbc4b6ac..4ff9fce92 100644 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -80,27 +80,14 @@ startListening({ const { routine } = listenerApi.getState() as RootState for (const [_, thunk] of Object.entries<ThunkEntity>(routine.thunks)) { if (!thunk) { - return + continue } - const dto: ThunkEntityDTO = thunk listenerApi.dispatch(addRoutine(dto)) } }, }) -// unsubscribe old routine -startListening({ - predicate: (action) => addRoutine.match(action), - effect: async (action, listenerApi) => { - const { routine } = listenerApi.getOriginalState() as RootState - const lastThunk = routine.thunks[CATEGORIES[action.payload.category]] - if (lastThunk) { - RoutineManager.unsubscribe(lastThunk.id) - } - }, -}) - // add new routine startListening({ predicate: (action) => addRoutine.match(action), @@ -114,4 +101,16 @@ startListening({ }, }) +// unsubscribe old routine +startListening({ + predicate: (action) => addRoutine.match(action), + effect: async (action, listenerApi) => { + const { routine } = listenerApi.getOriginalState() as RootState + const lastThunk = routine.thunks[CATEGORIES[action.payload.category]] + if (lastThunk) { + RoutineManager.unsubscribe(lastThunk.id) + } + }, +}) + export default RoutineSlice.reducer diff --git a/react-ui/src/shared/reducer/user.reducer.ts b/react-ui/src/shared/reducer/user.reducer.ts index ce9f2b502..af0f2d171 100644 --- a/react-ui/src/shared/reducer/user.reducer.ts +++ b/react-ui/src/shared/reducer/user.reducer.ts @@ -1,15 +1,14 @@ -import { api, RbacUser, UserServiceGetUsersApiArg } from '@api/api'; -import { setCookieValue } from '@helper/coookie'; -import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { RootState } from '..'; +import { api, RbacUser, UserServiceGetUsersApiArg } from '@api/api' +import { setCookieValue } from '@helper/coookie' +import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit' +import { RootState } from '..' export interface UserSliceState { // defined by the frontend user input. This value is getting compared with the backend response - username: string, - user: RbacUser | null, + username: string + user: RbacUser | null } - const initialState: UserSliceState = { username: '', user: null, @@ -19,13 +18,15 @@ const userSlice = createSlice({ name: 'user', initialState, reducers: { - setToken: (state, action: PayloadAction<{ token: string, username: string }>) => { - const token = action.payload?.token || ''; - setCookieValue('token', token); - + setToken: (state, action: PayloadAction<{ token: string; username: string } | null>) => { + const token = action.payload?.token || '' + setCookieValue('token', token) + state.username = action.payload?.username || '' }, - setUser: (state, action: PayloadAction<RbacUser>) => { state.user = action.payload }, + setUser: (state, action: PayloadAction<RbacUser>) => { + state.user = action.payload + }, }, }) @@ -33,30 +34,27 @@ export const { setToken } = userSlice.actions export const { setUser } = userSlice.actions export default userSlice.reducer -export const userReducerPath = userSlice.reducerPath; +export const userReducerPath = userSlice.reducerPath - -export const fetchUser = createAsyncThunk( - 'user/fetchUser', - (_, thunkAPI) => { - const payload: UserServiceGetUsersApiArg = {}; +export const fetchUser = createAsyncThunk('user/fetchUser', (_, thunkAPI) => { + const payload: UserServiceGetUsersApiArg = {} thunkAPI.dispatch(api.endpoints.userServiceGetUsers.initiate(payload)).then((response) => { if (response.error || !response.data?.user?.length) { // TODO proper error handling - throw new Error('Fetching the pnd list after successful login failed'); + throw new Error('Fetching the pnd list after successful login failed') } - const { user } = thunkAPI.getState() as RootState; + const { user } = thunkAPI.getState() as RootState // TODO ask if this is the correct approach - const matchedUser = response.data.user.find((_user) => _user.name === user.username); + const matchedUser = response.data.user.find((_user) => _user.name === user.username) if (!matchedUser) { // TODO proper error handling - throw new Error('No user found with the provided username'); + throw new Error('No user found with the provided username') } - thunkAPI.dispatch(setUser(matchedUser)); - }); -}); \ No newline at end of file + thunkAPI.dispatch(setUser(matchedUser)) + }) +}) diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index 653112db7..ade079289 100644 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -1,75 +1,72 @@ -import { QueryActionCreatorResult } from '@reduxjs/toolkit/query'; +import { QueryActionCreatorResult } from '@reduxjs/toolkit/query' -type Routine = QueryActionCreatorResult<any>; +type Routine = QueryActionCreatorResult<any> interface Entity { - routine: Routine, + routine: Routine id: number } const initialState = { - routines: [] as Entity[] + routines: [] as Entity[], } - /** * Routine manager is a singleton that holds all running routines. * The redux store holds any persistable information about the routines. * The routines objects itself are stored in the RoutineManager. */ export const RoutineManager = (() => { - const state = initialState; + const state = initialState const add = (routine: Routine): number => { - const id = state.routines.length; + const id = state.routines.length const newEntity: Entity = { routine: routine, - id + id, } - state.routines = [...state.routines, newEntity]; + state.routines = [...state.routines, newEntity] - return id; + return id } - const unsubscribeAll = () => { state.routines.forEach(({ routine: subscription }) => { _unsubscribe(subscription) - }); + }) - state.routines = initialState.routines; + state.routines = initialState.routines } /** - * @param id + * @param id * @returns returns true if the routine was stopped, false if it was not found */ const unsubscribe = (id: number): boolean => { - const routine = state.routines.find(({ id: routineId }) => routineId === id); + const routine = state.routines.find(({ id: routineId }) => routineId === id) if (routine) { - _unsubscribe(routine.routine); + _unsubscribe(routine.routine) } - return !!routine; + return !!routine } /** * Actual unsubscribe process. * This process is extracted to have a single process of unsubscribing. - * - * @param subscription + * + * @param subscription */ const _unsubscribe = (subscription: Routine) => { - subscription.unsubscribe(); + subscription.unsubscribe() // TODO remove from state } - return { add, unsubscribe, - unsubscribeAll + unsubscribeAll, } -})(); \ No newline at end of file +})() diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts index fd894e97b..57ed95b64 100644 --- a/react-ui/src/stores/api.store.ts +++ b/react-ui/src/stores/api.store.ts @@ -1,18 +1,19 @@ -import { getCookieValue } from '@helper/coookie'; -import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; +import { getCookieValue } from '@helper/coookie' +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' // initialize an empty api service that we'll inject endpoints into later as needed export const emptySplitApi = createApi({ - baseQuery: fetchBaseQuery({ - baseUrl: '/api', prepareHeaders: (headers) => { - const token = getCookieValue('token'); + baseQuery: fetchBaseQuery({ + baseUrl: '/api', + prepareHeaders: (headers) => { + const token = getCookieValue('token') - if (token) { - headers.set('authorize', `${token}`) - } + if (token) { + headers.set('authorize', `${token}`) + } - return headers - }, - }), - endpoints: () => ({}), -}) \ No newline at end of file + return headers + }, + }), + endpoints: () => ({}), +}) diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts index e9a18016b..9b738e47f 100644 --- a/react-ui/src/stores/index.ts +++ b/react-ui/src/stores/index.ts @@ -5,20 +5,31 @@ import { setupListeners } from '@reduxjs/toolkit/query' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist' import persistStore from 'redux-persist/es/persistStore' import { emptySplitApi } from './api.store' -import { rtkQueryErrorLogger } from './middleware/devLogging.middleware' +import { rtkQueryErrorLogger } from './middleware/api.listener.middleware' import { listenerMiddleware } from './middleware/listener.middleware' import persistedReducer from './persist.store' - export const store = configureStore({ - reducer: persistedReducer, - middleware: (getDefaultMiddleware) => - getDefaultMiddleware({ - serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, FETCH_DEVICE_ACTION + '/fulfilled', FETCH_MNE_ACTION + '/fulfilled', 'routine/addRoutine'], - ignoredPaths: ['routine.thunks'] - }, - }).prepend(listenerMiddleware.middleware).concat(emptySplitApi.middleware, rtkQueryErrorLogger), + reducer: persistedReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [ + FLUSH, + REHYDRATE, + PAUSE, + PERSIST, + PURGE, + REGISTER, + FETCH_DEVICE_ACTION + '/fulfilled', + FETCH_MNE_ACTION + '/fulfilled', + 'routine/addRoutine', + ], + ignoredPaths: ['routine.thunks'], + }, + }) + .prepend(listenerMiddleware.middleware) + .concat(emptySplitApi.middleware, rtkQueryErrorLogger), }) export const persistor = persistStore(store) @@ -26,6 +37,6 @@ export const persistor = persistStore(store) // TODO setupListeners(store.dispatch) -export type RootState = ReturnType<typeof store.getState>; -export type MyState = ReturnType<typeof persistedReducer>; -export type AppDispatch = typeof store.dispatch; \ No newline at end of file +export type RootState = ReturnType<typeof store.getState> +export type MyState = ReturnType<typeof persistedReducer> +export type AppDispatch = typeof store.dispatch diff --git a/react-ui/src/stores/middleware/api.listener.middleware.ts b/react-ui/src/stores/middleware/api.listener.middleware.ts new file mode 100644 index 000000000..b6a1a713e --- /dev/null +++ b/react-ui/src/stores/middleware/api.listener.middleware.ts @@ -0,0 +1,26 @@ +import { isRejectedWithValue } from '@reduxjs/toolkit' +import { setToken } from '@shared/reducer/user.reducer' +import { toast } from 'react-toastify' +import { Middleware, MiddlewareAPI } from 'redux' + +/** + * Log a warning and show a toast! + */ +export const rtkQueryErrorLogger: Middleware = (api: MiddlewareAPI) => (next) => (action) => { + if (!isRejectedWithValue(action)) { + return next(action) + } + + const errorCode = action.payload.status || -1 + switch (errorCode) { + case 403: + case 401: + api.dispatch(setToken(null)) + toast.info('Your session has expired. Please login again', {}) + break + default: + console.warn('An unkown error code returned: ' + errorCode) + } + + return next(action) +} diff --git a/react-ui/src/stores/middleware/devLogging.middleware.ts b/react-ui/src/stores/middleware/devLogging.middleware.ts deleted file mode 100644 index 2e58a2ea5..000000000 --- a/react-ui/src/stores/middleware/devLogging.middleware.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { isRejectedWithValue } from "@reduxjs/toolkit" -import { toast } from "react-toastify" -import { Middleware, MiddlewareAPI } from "redux" - -const environment = process.env.NODE_ENV || 'prod'; - -// TODO check env before creation of this middleware - -/** - * Log a warning and show a toast! - */ -export const rtkQueryErrorLogger: Middleware = (api: MiddlewareAPI) => (next) => (action) => { - // RTK Query uses `createAsyncThunk` from redux-toolkit under the hood, so we're able to utilize these matchers! - if (environment !== 'prod' && isRejectedWithValue(action)) { - console.warn(action.error) - toast.warn('data' in action.error - ? (action.error.data as { message: string }).message - : action.error.message, { - - }) - } - - return next(action) -} \ No newline at end of file -- GitLab From d67a0553c9f8a876e2dcd2d2d58c8aa672fb4a07 Mon Sep 17 00:00:00 2001 From: matthiasf <matthias.feyll@@stud.h-da.de> Date: Mon, 18 Nov 2024 15:53:22 +0100 Subject: [PATCH 33/78] implement yang model visual representation --- react-ui/.gitignore | 0 react-ui/.prettierrc | 2 +- react-ui/README.md | 0 react-ui/assets/logo.svg | 0 react-ui/dist/assets/logo-Bj6KFr1z.svg | 0 react-ui/dist/favicon.ico | Bin react-ui/dist/fonts/Inter.ttf | Bin react-ui/dist/index.html | 0 react-ui/dist/logo.png | Bin react-ui/dist/logo.svg | 0 react-ui/dist/manifest.json | 0 react-ui/dist/robots.txt | 0 react-ui/docker/wasm/Dockerfile | 0 react-ui/docs/README.md | 0 react-ui/docs/design.md | 0 react-ui/docs/development.md | 0 react-ui/docs/routine_pattern.md | 0 react-ui/docs/routine_pattern.png | Bin react-ui/eslint.config.js | 0 react-ui/index.html | 0 react-ui/package.json | 1 + react-ui/public/favicon.ico | Bin react-ui/public/fonts/Inter.ttf | Bin react-ui/public/logo.png | Bin react-ui/public/logo.svg | 0 react-ui/public/manifest.json | 0 react-ui/public/robots.txt | 0 react-ui/scripts/openapi-config.json | 0 .../src/components/devices/index.module.ts | 5 + .../devices/reducer/device.reducer.ts | 0 .../devices/routines/device.routine.ts | 0 .../src/components/devices/routines/index.ts | 0 .../devices/routines/mne.routine.ts | 0 .../src/components/devices/view/device.scss | 37 ++-- .../devices/view/device.view.table.tsx | 2 +- .../devices/view/device.view.tabs.tsx | 10 +- .../components/devices/view/device.view.tsx | 63 ++++--- .../view_model/device.table.viewmodel.ts | 0 .../view_model/device.tabs.viewmodel.ts | 28 +-- .../devices/view_model/device.viewmodel.ts | 0 .../components/login/layouts/login.layout.tsx | 0 react-ui/src/components/login/view/login.scss | 0 .../src/components/login/view/login.view.tsx | 1 + .../login/viewmodel/login.viewmodel.ts | 0 react-ui/src/hooks.ts | 0 react-ui/src/i18n/config.js | 0 .../src/i18n/locales/de/translations.json | 0 .../src/i18n/locales/en/translations.json | 0 react-ui/src/index.scss | 0 react-ui/src/index.tsx | 0 react-ui/src/routes.tsx | 0 react-ui/src/setupTests.js | 0 react-ui/src/shared/api/api.ts | 0 react-ui/src/shared/components/README.md | 3 + .../reducer/json_viewer.reducer.ts | 90 ++++++++++ .../json_viewer/view/json_viewer.scss | 47 +++++ .../json_viewer/view/json_viewer.view.tsx | 91 ++++++++++ .../viewmodel/json_viewer.viewmodel.tsx | 55 ++++++ react-ui/src/shared/helper/coookie.ts | 0 react-ui/src/shared/icons/icons.ts | 0 react-ui/src/shared/layouts/basic.layout.tsx | 0 .../protected.layout/protected.layout.scss | 0 .../protected.layout/protected.layout.tsx | 0 .../src/shared/provider/auth.provider.tsx | 0 .../src/shared/reducer/routine.reducer.ts | 29 +-- react-ui/src/shared/reducer/user.reducer.ts | 0 react-ui/src/shared/style/box.scss | 0 react-ui/src/shared/style/colors.scss | 1 + react-ui/src/shared/style/fonts.scss | 0 react-ui/src/shared/style/index.scss | 0 react-ui/src/shared/style/toast.scss | 0 react-ui/src/shared/style/utils.scss | 0 react-ui/src/shared/utils/routine.manager.ts | 0 .../shared/utils/yang_parser/go/.gitignore | 0 .../go/assets/wasm_exec.d.ts.generated | 0 .../src/shared/utils/yang_parser/go/go.env | 0 .../src/shared/utils/yang_parser/go/go.mod | 0 .../src/shared/utils/yang_parser/go/go.sum | 0 .../utils/yang_parser/go/yang_parser.go | 0 .../shared/utils/yang_parser/yang_parser.ts | 0 react-ui/src/stores/api.store.ts | 0 react-ui/src/stores/index.ts | 0 .../middleware/api.listener.middleware.ts | 0 .../stores/middleware/listener.middleware.ts | 0 react-ui/src/stores/persist.store.ts | 2 + react-ui/tsconfig.eslint.json | 0 react-ui/tsconfig.json | 0 react-ui/tsconfig.node.json | 0 react-ui/vite.config.mjs | 0 react-ui/yarn.lock | 168 +++++++++++++++++- 90 files changed, 558 insertions(+), 77 deletions(-) mode change 100644 => 100755 react-ui/.gitignore mode change 100644 => 100755 react-ui/.prettierrc mode change 100644 => 100755 react-ui/README.md mode change 100644 => 100755 react-ui/assets/logo.svg mode change 100644 => 100755 react-ui/dist/assets/logo-Bj6KFr1z.svg mode change 100644 => 100755 react-ui/dist/favicon.ico mode change 100644 => 100755 react-ui/dist/fonts/Inter.ttf mode change 100644 => 100755 react-ui/dist/index.html mode change 100644 => 100755 react-ui/dist/logo.png mode change 100644 => 100755 react-ui/dist/logo.svg mode change 100644 => 100755 react-ui/dist/manifest.json mode change 100644 => 100755 react-ui/dist/robots.txt mode change 100644 => 100755 react-ui/docker/wasm/Dockerfile mode change 100644 => 100755 react-ui/docs/README.md mode change 100644 => 100755 react-ui/docs/design.md mode change 100644 => 100755 react-ui/docs/development.md mode change 100644 => 100755 react-ui/docs/routine_pattern.md mode change 100644 => 100755 react-ui/docs/routine_pattern.png mode change 100644 => 100755 react-ui/eslint.config.js mode change 100644 => 100755 react-ui/index.html mode change 100644 => 100755 react-ui/package.json mode change 100644 => 100755 react-ui/public/favicon.ico mode change 100644 => 100755 react-ui/public/fonts/Inter.ttf mode change 100644 => 100755 react-ui/public/logo.png mode change 100644 => 100755 react-ui/public/logo.svg mode change 100644 => 100755 react-ui/public/manifest.json mode change 100644 => 100755 react-ui/public/robots.txt mode change 100644 => 100755 react-ui/scripts/openapi-config.json create mode 100755 react-ui/src/components/devices/index.module.ts mode change 100644 => 100755 react-ui/src/components/devices/reducer/device.reducer.ts mode change 100644 => 100755 react-ui/src/components/devices/routines/device.routine.ts mode change 100644 => 100755 react-ui/src/components/devices/routines/index.ts mode change 100644 => 100755 react-ui/src/components/devices/routines/mne.routine.ts mode change 100644 => 100755 react-ui/src/components/devices/view/device.scss mode change 100644 => 100755 react-ui/src/components/devices/view/device.view.table.tsx mode change 100644 => 100755 react-ui/src/components/devices/view/device.view.tabs.tsx mode change 100644 => 100755 react-ui/src/components/devices/view/device.view.tsx mode change 100644 => 100755 react-ui/src/components/devices/view_model/device.table.viewmodel.ts mode change 100644 => 100755 react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts mode change 100644 => 100755 react-ui/src/components/devices/view_model/device.viewmodel.ts mode change 100644 => 100755 react-ui/src/components/login/layouts/login.layout.tsx mode change 100644 => 100755 react-ui/src/components/login/view/login.scss mode change 100644 => 100755 react-ui/src/components/login/view/login.view.tsx mode change 100644 => 100755 react-ui/src/components/login/viewmodel/login.viewmodel.ts mode change 100644 => 100755 react-ui/src/hooks.ts mode change 100644 => 100755 react-ui/src/i18n/config.js mode change 100644 => 100755 react-ui/src/i18n/locales/de/translations.json mode change 100644 => 100755 react-ui/src/i18n/locales/en/translations.json mode change 100644 => 100755 react-ui/src/index.scss mode change 100644 => 100755 react-ui/src/index.tsx mode change 100644 => 100755 react-ui/src/routes.tsx mode change 100644 => 100755 react-ui/src/setupTests.js mode change 100644 => 100755 react-ui/src/shared/api/api.ts create mode 100644 react-ui/src/shared/components/README.md create mode 100755 react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts create mode 100755 react-ui/src/shared/components/json_viewer/view/json_viewer.scss create mode 100755 react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx create mode 100644 react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx mode change 100644 => 100755 react-ui/src/shared/helper/coookie.ts mode change 100644 => 100755 react-ui/src/shared/icons/icons.ts mode change 100644 => 100755 react-ui/src/shared/layouts/basic.layout.tsx mode change 100644 => 100755 react-ui/src/shared/layouts/protected.layout/protected.layout.scss mode change 100644 => 100755 react-ui/src/shared/layouts/protected.layout/protected.layout.tsx mode change 100644 => 100755 react-ui/src/shared/provider/auth.provider.tsx mode change 100644 => 100755 react-ui/src/shared/reducer/routine.reducer.ts mode change 100644 => 100755 react-ui/src/shared/reducer/user.reducer.ts mode change 100644 => 100755 react-ui/src/shared/style/box.scss mode change 100644 => 100755 react-ui/src/shared/style/colors.scss mode change 100644 => 100755 react-ui/src/shared/style/fonts.scss mode change 100644 => 100755 react-ui/src/shared/style/index.scss mode change 100644 => 100755 react-ui/src/shared/style/toast.scss mode change 100644 => 100755 react-ui/src/shared/style/utils.scss mode change 100644 => 100755 react-ui/src/shared/utils/routine.manager.ts mode change 100644 => 100755 react-ui/src/shared/utils/yang_parser/go/.gitignore mode change 100644 => 100755 react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated mode change 100644 => 100755 react-ui/src/shared/utils/yang_parser/go/go.env mode change 100644 => 100755 react-ui/src/shared/utils/yang_parser/go/go.mod mode change 100644 => 100755 react-ui/src/shared/utils/yang_parser/go/go.sum mode change 100644 => 100755 react-ui/src/shared/utils/yang_parser/go/yang_parser.go mode change 100644 => 100755 react-ui/src/shared/utils/yang_parser/yang_parser.ts mode change 100644 => 100755 react-ui/src/stores/api.store.ts mode change 100644 => 100755 react-ui/src/stores/index.ts mode change 100644 => 100755 react-ui/src/stores/middleware/api.listener.middleware.ts mode change 100644 => 100755 react-ui/src/stores/middleware/listener.middleware.ts mode change 100644 => 100755 react-ui/src/stores/persist.store.ts mode change 100644 => 100755 react-ui/tsconfig.eslint.json mode change 100644 => 100755 react-ui/tsconfig.json mode change 100644 => 100755 react-ui/tsconfig.node.json mode change 100644 => 100755 react-ui/vite.config.mjs mode change 100644 => 100755 react-ui/yarn.lock diff --git a/react-ui/.gitignore b/react-ui/.gitignore old mode 100644 new mode 100755 diff --git a/react-ui/.prettierrc b/react-ui/.prettierrc old mode 100644 new mode 100755 index 5438d4a98..7ed67eff4 --- a/react-ui/.prettierrc +++ b/react-ui/.prettierrc @@ -3,5 +3,5 @@ "singleQuote": true, "trailingComma": "es5", "tabWidth": 4, - "printWidth": 100 + "printWidth": 80 } diff --git a/react-ui/README.md b/react-ui/README.md old mode 100644 new mode 100755 diff --git a/react-ui/assets/logo.svg b/react-ui/assets/logo.svg old mode 100644 new mode 100755 diff --git a/react-ui/dist/assets/logo-Bj6KFr1z.svg b/react-ui/dist/assets/logo-Bj6KFr1z.svg old mode 100644 new mode 100755 diff --git a/react-ui/dist/favicon.ico b/react-ui/dist/favicon.ico old mode 100644 new mode 100755 diff --git a/react-ui/dist/fonts/Inter.ttf b/react-ui/dist/fonts/Inter.ttf old mode 100644 new mode 100755 diff --git a/react-ui/dist/index.html b/react-ui/dist/index.html old mode 100644 new mode 100755 diff --git a/react-ui/dist/logo.png b/react-ui/dist/logo.png old mode 100644 new mode 100755 diff --git a/react-ui/dist/logo.svg b/react-ui/dist/logo.svg old mode 100644 new mode 100755 diff --git a/react-ui/dist/manifest.json b/react-ui/dist/manifest.json old mode 100644 new mode 100755 diff --git a/react-ui/dist/robots.txt b/react-ui/dist/robots.txt old mode 100644 new mode 100755 diff --git a/react-ui/docker/wasm/Dockerfile b/react-ui/docker/wasm/Dockerfile old mode 100644 new mode 100755 diff --git a/react-ui/docs/README.md b/react-ui/docs/README.md old mode 100644 new mode 100755 diff --git a/react-ui/docs/design.md b/react-ui/docs/design.md old mode 100644 new mode 100755 diff --git a/react-ui/docs/development.md b/react-ui/docs/development.md old mode 100644 new mode 100755 diff --git a/react-ui/docs/routine_pattern.md b/react-ui/docs/routine_pattern.md old mode 100644 new mode 100755 diff --git a/react-ui/docs/routine_pattern.png b/react-ui/docs/routine_pattern.png old mode 100644 new mode 100755 diff --git a/react-ui/eslint.config.js b/react-ui/eslint.config.js old mode 100644 new mode 100755 diff --git a/react-ui/index.html b/react-ui/index.html old mode 100644 new mode 100755 diff --git a/react-ui/package.json b/react-ui/package.json old mode 100644 new mode 100755 index 439250704..57c152ac4 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -79,6 +79,7 @@ "globals": "^15.9.0", "prettier": "^3.3.3", "sass": "1.77.6", + "sass-embedded": "^1.80.6", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", "vite": "^5.4.9", diff --git a/react-ui/public/favicon.ico b/react-ui/public/favicon.ico old mode 100644 new mode 100755 diff --git a/react-ui/public/fonts/Inter.ttf b/react-ui/public/fonts/Inter.ttf old mode 100644 new mode 100755 diff --git a/react-ui/public/logo.png b/react-ui/public/logo.png old mode 100644 new mode 100755 diff --git a/react-ui/public/logo.svg b/react-ui/public/logo.svg old mode 100644 new mode 100755 diff --git a/react-ui/public/manifest.json b/react-ui/public/manifest.json old mode 100644 new mode 100755 diff --git a/react-ui/public/robots.txt b/react-ui/public/robots.txt old mode 100644 new mode 100755 diff --git a/react-ui/scripts/openapi-config.json b/react-ui/scripts/openapi-config.json old mode 100644 new mode 100755 diff --git a/react-ui/src/components/devices/index.module.ts b/react-ui/src/components/devices/index.module.ts new file mode 100755 index 000000000..5ef9299bd --- /dev/null +++ b/react-ui/src/components/devices/index.module.ts @@ -0,0 +1,5 @@ +import { fetchSelectedMneThunk } from './routines/mne.routine' + +const routines = { + fetchSelectedMneThunk: fetchSelectedMneThunk, +} diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/components/devices/routines/device.routine.ts b/react-ui/src/components/devices/routines/device.routine.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/components/devices/routines/index.ts b/react-ui/src/components/devices/routines/index.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/components/devices/view/device.scss b/react-ui/src/components/devices/view/device.scss old mode 100644 new mode 100755 index afebc6fe5..540cd4d01 --- a/react-ui/src/components/devices/view/device.scss +++ b/react-ui/src/components/devices/view/device.scss @@ -1,26 +1,27 @@ -@import '/src/shared/style/colors.scss'; +@import "/src/shared/style/colors.scss"; -thead { - font-size: 0.9em; -} - -tr:hover > td { - background-color: lighten(map-get($theme-colors, primary), 30%) !important; - cursor: pointer; -} +.device-table { + & thead { + font-size: 0.9em; + } -tr.active > td { - background-color: lighten(map-get($theme-colors, primary), 5%) !important; + & tr:hover > td { + background-color: map-get($theme-colors, "primary::hover"); + cursor: pointer; + } - color: map-get($theme-colors, 'black') !important; -} + & tr.active > td { + background-color: lighten(map-get($theme-colors, primary), 5%) !important; + color: map-get($theme-colors, "black") !important; + } -tr > td { - color: map-get($theme-colors, 'dark') !important; -} + & tr > td { + color: map-get($theme-colors, "dark") !important; + } -tr:nth-child(2n + 1) > td { - background-color: lighten(map-get($theme-colors, primary), 38%); + & tr:nth-child(2n + 1) > td { + background-color: lighten(map-get($theme-colors, primary), 38%); + } } .c-box { diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx old mode 100644 new mode 100755 index 933b50a8a..312caab60 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -42,7 +42,7 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = return ( - <Table striped responsive> + <Table striped responsive className="device-table"> <thead> <tr> <th>{t('device.table.header.name')}</th> diff --git a/react-ui/src/components/devices/view/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx old mode 100644 new mode 100755 index 05e854651..d492c90b7 --- a/react-ui/src/components/devices/view/device.view.tabs.tsx +++ b/react-ui/src/components/devices/view/device.view.tabs.tsx @@ -1,5 +1,5 @@ import { useAppSelector } from "@hooks"; -import ReactJson from 'react-json-view'; +import { JsonViewer } from "../../../shared/components/json_viewer/view/json_viewer.view"; import { useDeviceTabsViewModel } from "../view_model/device.tabs.viewmodel"; export enum DeviceViewTabValues { @@ -9,7 +9,7 @@ export enum DeviceViewTabValues { export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { const { selectedDevice } = useAppSelector(state => state.device); - const { yang } = useDeviceTabsViewModel(); + const { jsonYang } = useDeviceTabsViewModel(); const metadataTab = () => { return ( @@ -22,8 +22,10 @@ export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { const yangModelTab = () => { return ( <> - {selectedDevice?.json && - <ReactJson src={selectedDevice.json} name={false} collapsed={false} quotesOnKeys={false} /> + {jsonYang && + <JsonViewer json={jsonYang} /> + + //<ReactJson src={selectedDevice.json} name={false} collapsed={true} quotesOnKeys={false} /> } </> ); diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx old mode 100644 new mode 100755 index 0d04b959c..2602463bb --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -13,34 +13,49 @@ function DeviceView() { return ( <div className='m-4 pt-4'> - <Container className="bg-white rounded c-box" fluid> + <Container fluid> <Row> - <Col sm={7} className='border-right mt-4'><h3 className='text-black-50'>{t('device.title')}</h3></Col> - <Col sm={5} className='mt-4'> - <Nav className='justify-content-around'> - <NavLink className={handleActiveTabLink(DeviceViewTabValues.METADATA) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.METADATA)}>{t('device.tabs.metadata.title')}</NavLink> - <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> - </Nav> - </Col> - </Row> + <Col sm={5}> + <Container className='bg-white rounded c-box'> + <Row> + <Col sm={12} className='mt-4'><h3 className='text-black-50'>{t('device.title')}</h3></Col> + </Row> - <Row className='align-items-center'> - <Col sm={3}> - <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> - <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> - </Form.Group> - </Col> - <Col sm={{ span: 2, offset: 2 }} className='border-right pt-2'> - <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> - </Col> - </Row> + <Row className='align-items-center'> + <Col sm={6}> + <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> + <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> + </Form.Group> + </Col> + <Col sm={{ span: 3, offset: 3 }} className='pt-2'> + <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> + </Col> + </Row> - <Row className='align-items-start'> - <Col sm={7} className='pt-2 border-right'> - {DeviceViewTable(searchRef)} + <Row className='align-items-start'> + <Col sm={12} className='pt-2'> + {DeviceViewTable(searchRef)} + </Col> + </Row> + </Container> </Col> - <Col sm={5} className='pt-2'> - {DeviceViewTabs(activeTab)} + <Col sm={7}> + <Container className='bg-white rounded c-box'> + <Row> + <Col sm={12} className='mt-4'> + <Nav className='justify-content-around'> + <NavLink className={handleActiveTabLink(DeviceViewTabValues.METADATA) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.METADATA)}>{t('device.tabs.metadata.title')}</NavLink> + <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> + </Nav> + </Col> + </Row> + + <Row className='align-items-start'> + <Col sm={12} className='pt-2'> + {DeviceViewTabs(activeTab)} + </Col> + </Row> + </Container> </Col> </Row> </Container> diff --git a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts old mode 100644 new mode 100755 index e15f7c721..4a60567b6 --- a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts @@ -1,6 +1,5 @@ import { useAppSelector } from '@hooks' -import { useYangParser } from '@utils/yang_parser/yang_parser' -import { useEffect, useRef } from 'react' +import { useMemo } from 'react' export enum DeviceViewTabValues { METADATA = 'metadata', @@ -9,24 +8,25 @@ export enum DeviceViewTabValues { export const useDeviceTabsViewModel = () => { const { selectedDevice } = useAppSelector((state) => state.device) - const { parse } = useYangParser() - const yang = useRef<JSON | null>() - useEffect(() => { - const serializedYang = selectedDevice?.mne?.model + const getYangModelJSON = (): JSON | null => { + if (!selectedDevice?.json) { + return null + } + + const key = Object.keys(selectedDevice.json).at(1) as keyof typeof selectedDevice.json + const innerJson = selectedDevice.json[key] - if (!serializedYang) { - return + if (!(innerJson instanceof Object)) { + return null } - console.log(serializedYang) + return innerJson + } - // parse(serializedYang).then((json) => { - // yang.current = json - // }) - }, [selectedDevice, parse]) + const jsonYang = useMemo<JSON | null>(getYangModelJSON, [selectedDevice]) return { - yang, + jsonYang, } } diff --git a/react-ui/src/components/devices/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/components/login/layouts/login.layout.tsx b/react-ui/src/components/login/layouts/login.layout.tsx old mode 100644 new mode 100755 diff --git a/react-ui/src/components/login/view/login.scss b/react-ui/src/components/login/view/login.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/components/login/view/login.view.tsx b/react-ui/src/components/login/view/login.view.tsx old mode 100644 new mode 100755 index 0db0ea206..e393bb4b3 --- a/react-ui/src/components/login/view/login.view.tsx +++ b/react-ui/src/components/login/view/login.view.tsx @@ -47,6 +47,7 @@ const LoginView = ({ children }) => { ref={usernameRef} required autoComplete='on' + autoFocus={true} /> <Form.Control.Feedback type="invalid"> {t('global.form.empty_field')} diff --git a/react-ui/src/components/login/viewmodel/login.viewmodel.ts b/react-ui/src/components/login/viewmodel/login.viewmodel.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/hooks.ts b/react-ui/src/hooks.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/i18n/config.js b/react-ui/src/i18n/config.js old mode 100644 new mode 100755 diff --git a/react-ui/src/i18n/locales/de/translations.json b/react-ui/src/i18n/locales/de/translations.json old mode 100644 new mode 100755 diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json old mode 100644 new mode 100755 diff --git a/react-ui/src/index.scss b/react-ui/src/index.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx old mode 100644 new mode 100755 diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx old mode 100644 new mode 100755 diff --git a/react-ui/src/setupTests.js b/react-ui/src/setupTests.js old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/api/api.ts b/react-ui/src/shared/api/api.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/components/README.md b/react-ui/src/shared/components/README.md new file mode 100644 index 000000000..6694ec6f8 --- /dev/null +++ b/react-ui/src/shared/components/README.md @@ -0,0 +1,3 @@ +#### Documentation + +Shared components are components that will be reused. Each shared component is completely isolated by other components as well as the rest of the project. \ No newline at end of file diff --git a/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts new file mode 100755 index 000000000..cdd0351b1 --- /dev/null +++ b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts @@ -0,0 +1,90 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit' + +export enum CollapseValues { + TOGGLE, + FALSE, + TRUE +} + +const CollapseActions = { + [CollapseValues.TOGGLE]: (collapse: boolean) => { return collapse = !collapse }, + [CollapseValues.FALSE]: () => { return false }, + [CollapseValues.TRUE]: () => { return true }, +} + +type Identifier = { + key: string, + nested: number +} + + +// containg object location and collapsed information +interface CollapsedItem { + identifier: Identifier + collapsed: boolean +} + +export interface ReducerState { + breadcrumbs: Array<string>, + + /** + * Meta container containg identifier of + * all non collapsed json objects + */ + collapseContainer: Array<CollapsedItem> +} + +const initialState: ReducerState = { + breadcrumbs: [], + collapseContainer: [], +} + +export const compareIdentifier = (a: Identifier, b: Identifier): boolean => { + return a.key === b.key && a.nested === b.nested; +} + +/** + * Every component instance has its own id. + * This id is getting used as key to define the respective object container + */ +const JsonViewerSlice = createSlice({ + name: 'json_viewer', + initialState, + reducers: { + toggleCollapse: (state, { payload }: PayloadAction<{ identifier: Identifier, collapse: CollapseValues }>) => { + const { identifier, collapse } = payload + + // potentially find already collapsed + let i = state.collapseContainer.findIndex(i => compareIdentifier(identifier, i.identifier)) + + + if (i === -1) { + console.log('new ' + payload.key + " => " + payload.nested + ' end') + // create new collapse + const newItem = { identifier, collapsed: true } + state.collapseContainer = [...state.collapseContainer, newItem] + return; + } + + // update nested attribute + state.collapseContainer = state.collapseContainer.map((item, index) => { + if (index !== i) { + return item + } + + return { + ...item, + collapsed: CollapseActions[collapse](item.collapsed) + } + }) + }, + setBreadcrumbs: (state, { payload }: PayloadAction<Array<string>>) => { + state.breadcrumbs = payload + }, + }, +}) + +export const { toggleCollapse, setBreadcrumbs } = JsonViewerSlice.actions + + +export default JsonViewerSlice.reducer diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss new file mode 100755 index 000000000..387290aaf --- /dev/null +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss @@ -0,0 +1,47 @@ +@import "/src/shared/style/colors.scss"; + +.list-group-tr { + list-style-type: none; + margin: 0; + padding: 0 0; +} + +.list-item-td { + & > td { + color: lighten(map-get($map: $theme-colors, $key: "black"), 20%) !important; + background-color: white !important; + border: 0; + padding: 0.1em 0 !important; + } + + & > td:nth-child(2) { + text-align: left; + } + + &:hover > td { + background-color: map-get($theme-colors, "primary::hover") !important; + } +} + +.list-item-td.object { + & > td { + color: map-get($map: $theme-colors, $key: "black") !important; + } + + &:not(:first-child) > td { + padding-top: 0.5em !important; + } + + &:hover { + cursor: pointer; + } +} + +.list-item-td:not(.object) > td:first-child { + border-left: 2px solid black; + padding-left: 0.2em !important; +} + +td .icon { + font-size: 0.8em; +} diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx new file mode 100755 index 000000000..39bdb8738 --- /dev/null +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -0,0 +1,91 @@ +import { faAlignRight } from "@fortawesome/free-solid-svg-icons" +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" +import { useAppDispatch } from "@hooks" +import React, { Suspense, useMemo } from "react" +import { Table } from "react-bootstrap" +import { useJsonViewer } from "../viewmodel/json_viewer.viewmodel" +import './json_viewer.scss' + +type JsonViewerProbs = { + json: JSON +} + +export const JsonViewer = ({ json }: JsonViewerProbs) => { + const { getSubset, breadcrumbs, isCollapsed, collapseable, collapse } = useJsonViewer(); + const dispatch = useAppDispatch(); + + const breadcrumbHTML = useMemo(() => { + return ( + <nav aria-label="breadcrumb"> + <ol className="breadcrumb"> + {breadcrumbs.map(breadcrumb => ( + <li key={breadcrumb} className="breadcrumb-item"><a href="#">{breadcrumb}</a></li> + ))} + </ol> + </nav> + ) + }, [breadcrumbs]) + + + const renderInner = (innerJson: JSON, nested: number = 0): JSX.Element => { + return Object.entries(innerJson).map(([key, value]): JSX.Element => { + const isObject = value instanceof Object; + const readableValue = isObject ? '' : value; + + const collapsed = isCollapsed(key, nested); + + const icon = isObject ? + <span className={collapsed ? 'fa-rotate-90' : ''}>></span> : <FontAwesomeIcon className="icon fa-rotate-180" icon={faAlignRight} size="xs" /> + + + // determine the margin-left: n indent + let tabs = 0.0; + for (let i = 0; i < nested; i++) { + tabs += 0.3; + } + + return ( + <React.Fragment key={`${nested}-${key}`}> + <tr className={"list-item-td " + key + " " + nested + " " + (isObject ? 'object' : '')} onClick={() => { isObject ? collapse(key, nested, value) : null }} > + <td style={{ marginLeft: tabs + 'em' }} className={"d-flex align-items-center "}>{icon}<span> {key}</span></td> + <td>{readableValue}</td> + <td className="text-end">comands</td> + </tr > + {isObject && collapsed ? renderInner(value, nested + 1) : ''} + </React.Fragment > + ) + }) + } + + + const renderJson = (json: JSON): JSX.Element => { + return ( + <Table className="list-group-tr"> + <tbody> + { + renderInner(json) + } + </tbody> + </Table > + ) + } + + + const hierarchyHTML = useMemo(() => { + const subset = getSubset(json); + return ( + <> + <Suspense fallback={<div>loading...</div>}> + {renderJson(subset)} + </Suspense> + </> + ) + }, [json, collapseable]) + + return ( + <div> + {breadcrumbHTML} + {hierarchyHTML} + </div> + ) +} \ No newline at end of file diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx new file mode 100644 index 000000000..d7ccd5d5a --- /dev/null +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -0,0 +1,55 @@ +import { useAppDispatch, useAppSelector } from "@hooks"; +import { compareIdentifier, toggleCollapse } from "../reducer/json_viewer.reducer"; + +export enum CollapseValues { + TOGGLE, + FALSE, + TRUE +} + + +export const useJsonViewer = () => { + const { breadcrumbs, collapseContainer } = useAppSelector(state => state.json_viwer) + const dispatch = useAppDispatch(); + + + const getSubset = (json: JSON) => { + const subset = breadcrumbs.reduce((nested, key) => nested?.[key], json); + + let inner = subset; + const keys: Array<string> = []; + while (Object.keys(inner).length === 1) { + const key: string = Object.keys(inner)[0]; + inner = inner[key]; + keys.push(key); + } + + //dispatch(setBreadcrumbs([...breadcrumbs, ...keys])) + return inner + } + + const isCollapsed = (key: string, nested: number): boolean => { + const item = collapseContainer + .filter(({ identifier, collapsed }) => compareIdentifier(identifier, { key, nested }) && collapsed); + return !!item.length; + } + + const collapse = (key: string, nested: number, json: Object, collapseState: CollapseValues = CollapseValues.TOGGLE) => { + const identifier = { key, nested }; + dispatch(toggleCollapse({ identifier, collapse: collapseState })) + + const keys = Object.keys(json) + if (keys.length === 1) { + collapse(keys[0], nested + 1, json[keys[0]], CollapseValues.TRUE) + } + + } + + return { + getSubset, + breadcrumbs, + collapseable: collapseContainer, + isCollapsed, + collapse + } +} \ No newline at end of file diff --git a/react-ui/src/shared/helper/coookie.ts b/react-ui/src/shared/helper/coookie.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/icons/icons.ts b/react-ui/src/shared/icons/icons.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/layouts/basic.layout.tsx b/react-ui/src/shared/layouts/basic.layout.tsx old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts old mode 100644 new mode 100755 index 4ff9fce92..c7f9a43c1 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,6 +1,5 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit' import { RoutineManager } from '@utils/routine.manager' -import { REHYDRATE } from 'redux-persist' import { RootState } from '../../stores' import { startListening } from '../../stores/middleware/listener.middleware' import { setToken } from './user.reducer' @@ -74,19 +73,21 @@ startListening({ }) // on rehydrate add all persistet routines -startListening({ - predicate: ({ type }) => type === REHYDRATE, - effect: async (_, listenerApi) => { - const { routine } = listenerApi.getState() as RootState - for (const [_, thunk] of Object.entries<ThunkEntity>(routine.thunks)) { - if (!thunk) { - continue - } - const dto: ThunkEntityDTO = thunk - listenerApi.dispatch(addRoutine(dto)) - } - }, -}) +// TODO -> thunk does not have the thunk function object due to its coming from the store that ignores the value. +// at this point we have to figure out how to get the thunk function out of the "string" name +// startListening({ +// predicate: ({ type }) => type === REHYDRATE, +// effect: async (_, listenerApi) => { +// const { routine } = listenerApi.getState() as RootState +// for (const [_, thunk] of Object.entries<ThunkEntity>(routine.thunks)) { +// if (!thunk) { +// continue +// } +// const dto: ThunkEntityDTO = thunk +// listenerApi.dispatch(addRoutine(dto)) +// } +// }, +// }) // add new routine startListening({ diff --git a/react-ui/src/shared/reducer/user.reducer.ts b/react-ui/src/shared/reducer/user.reducer.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss old mode 100644 new mode 100755 index 80e75f8b7..749af9e8e --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -1,5 +1,6 @@ $theme-colors: ( 'primary': #b350e0, + 'primary::hover': #ddaff3af, 'bg-primary': #E1E1E1, 'danger': #ffdcdc, 'warning': #dbd116, diff --git a/react-ui/src/shared/style/fonts.scss b/react-ui/src/shared/style/fonts.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/style/index.scss b/react-ui/src/shared/style/index.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/style/toast.scss b/react-ui/src/shared/style/toast.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/style/utils.scss b/react-ui/src/shared/style/utils.scss old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/yang_parser/go/.gitignore b/react-ui/src/shared/utils/yang_parser/go/.gitignore old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated b/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/yang_parser/go/go.env b/react-ui/src/shared/utils/yang_parser/go/go.env old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/yang_parser/go/go.mod b/react-ui/src/shared/utils/yang_parser/go/go.mod old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/yang_parser/go/go.sum b/react-ui/src/shared/utils/yang_parser/go/go.sum old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/yang_parser/go/yang_parser.go b/react-ui/src/shared/utils/yang_parser/go/yang_parser.go old mode 100644 new mode 100755 diff --git a/react-ui/src/shared/utils/yang_parser/yang_parser.ts b/react-ui/src/shared/utils/yang_parser/yang_parser.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/stores/api.store.ts b/react-ui/src/stores/api.store.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/stores/index.ts b/react-ui/src/stores/index.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/stores/middleware/api.listener.middleware.ts b/react-ui/src/stores/middleware/api.listener.middleware.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/stores/middleware/listener.middleware.ts b/react-ui/src/stores/middleware/listener.middleware.ts old mode 100644 new mode 100755 diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts old mode 100644 new mode 100755 index c97edc465..e12467ed9 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,4 +1,5 @@ import deviceReducer from '@component/devices/reducer/device.reducer' +import jsonViewerReducer from '@shared/components/json_viewer/reducer/json_viewer.reducer' import routineReducer from '@shared/reducer/routine.reducer' import userReducer from '@shared/reducer/user.reducer' import { combineReducers } from 'redux' @@ -17,6 +18,7 @@ const rootReducer = combineReducers({ user: userReducer, device: deviceReducer, routine: routineReducer, + json_viwer: jsonViewerReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/tsconfig.eslint.json b/react-ui/tsconfig.eslint.json old mode 100644 new mode 100755 diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json old mode 100644 new mode 100755 diff --git a/react-ui/tsconfig.node.json b/react-ui/tsconfig.node.json old mode 100644 new mode 100755 diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs old mode 100644 new mode 100755 diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock old mode 100644 new mode 100755 index a52172744..5d2d968a7 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -1204,6 +1204,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@bufbuild/protobuf@^2.0.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.2.2.tgz#1a6d89603fb215dc4d4178052d05b30b83c75402" + integrity sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A== + "@csstools/normalize.css@*": version "12.1.1" resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.1.1.tgz#f0ad221b7280f3fc814689786fd9ee092776ef8f" @@ -3742,6 +3747,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-builder@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/buffer-builder/-/buffer-builder-0.2.0.tgz#3322cd307d8296dab1f604618593b261a3fade8f" + integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -3989,6 +3999,11 @@ colorette@^2.0.10: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +colorjs.io@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/colorjs.io/-/colorjs.io-0.5.2.tgz#63b20139b007591ebc3359932bef84628eb3fcef" + integrity sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -9450,6 +9465,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^7.4.0: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" @@ -9489,6 +9511,140 @@ sanitize.css@*: resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== +sass-embedded-android-arm64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.80.6.tgz#748df1f7deabea3a81c2c647661d9696090e1b81" + integrity sha512-4rC4ZGM/k4ENVjLXnK3JTst8e8FI9MHSol2Fl7dCdYyJ3KLnlt4qL4AEYfU8zq1tcBb7CBOSZVR+CzCKubnXdg== + +sass-embedded-android-arm@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.80.6.tgz#1fa2e08e5b2a77709f6e8cb8186c801ee140c0a9" + integrity sha512-UeUKMTRsnz4/dh7IzvhjONxa4/jmVp539CHDd8VZOsqg9M3HcNJNIkUzQWbuwZ+nSlWrTuo7Tvn3XlypopCBzw== + +sass-embedded-android-ia32@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.80.6.tgz#43674c98454a3adb5da3cca0ba23340128bfbdff" + integrity sha512-Lxz2SXE2KdHnynuHF+D6flDvrd55/zaEAWUeka9MxEr6FmR66d8UBOIy5ETwCSUd//S/SE5Jl6oTnHppgD1zNA== + +sass-embedded-android-riscv64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.80.6.tgz#59c9d53b1c800b53221d56cf55d9cf84b4418bac" + integrity sha512-hKdxY/oOqB+JJhSoBTDM5DJO1j/xtxQgayh2cLCCUx37IQQe3SEdc3V2JFf/4mIo5peaS4cjqwwSATF+l2zaXg== + +sass-embedded-android-x64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.80.6.tgz#a06a9f55f904c3ba628a3ae03c244f134f4f2bb1" + integrity sha512-Eap2Fi3kTx/rVLBsOnOp5RYPr5+lFjTZ652zR24dmYFe9/sDgasakJIOPjOvD2bRuL9z0uWEY1AXVeeOPeZKrg== + +sass-embedded-darwin-arm64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.80.6.tgz#81a7019c92a8c8f76f7f98dfe15f6adfaf621e92" + integrity sha512-0mnAx8Vq6Gxj3PQt3imgITfK33hhqrSKpyHSuab71gZZni5opsdtoggq2JawW+1taRFTEZwbZJLKZ0MBDbwCCA== + +sass-embedded-darwin-x64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.80.6.tgz#d1b551443930658bfa4cc92ca026d4b22023ce9d" + integrity sha512-Ib20yNZFOrJ7YVT+ltoe+JQNKPcRclM3iLAK69XZZYcSeFM/72SCoQBAaVGIpT23dxDp7FXiE4lO602c3xTRwQ== + +sass-embedded-linux-arm64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.80.6.tgz#fe6255bbbe55590fb6405f098431b3841221a1b0" + integrity sha512-n5r98pBXawrQQKaxIYCMM1zDpnngsqxTkOrmvsYLFiAMCSbR0lWf/7sBB33k/Pm0D6dsbp3jpHilCoQNKI3jIw== + +sass-embedded-linux-arm@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.80.6.tgz#a6603b1ec087762a1128e836fd36851050b537b4" + integrity sha512-QR0Q6TZox/ThuU2r9c0s3fKCgU2rXAEocpitdgxFp6tta+GsQlMFV3oON2unAa8Bwnuxkmf0YOaK0Oy/TwzkXw== + +sass-embedded-linux-ia32@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.80.6.tgz#bedb53348f7e384ceabc9e0158b086045779af07" + integrity sha512-O6dWZdcOkryRdDCxVMGOeVowgblpDgVcAuRtZ1F1X7XfbpDriTQm64D+9vVZIrywYSPoJfQMJJ662cr0wUs9IQ== + +sass-embedded-linux-musl-arm64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.80.6.tgz#0f0e0bb68c90f0ae920d9a06760241f3f58c7a76" + integrity sha512-VeUSHUi3MAsvOlg9QI4X/2j04h1659aE+7qKP/282CYBTrGkjFGSXZhIki9WKWDgIpDiSInRYXfQQRWhPhjCDg== + +sass-embedded-linux-musl-arm@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.80.6.tgz#41039f857684ee3470ec9e0d310add5f6f1b694d" + integrity sha512-X9FC8s8fvQGRiXc+eATlZ57N44Iq3nNa0M0ugi3ysdJwkaNYvOeS4QzBHKQAaw3QiTqdxTnLUHHVBkyzdCi9pw== + +sass-embedded-linux-musl-ia32@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.80.6.tgz#8ff88c78ba3503a19d59c5b8fa172fdea00a67f8" + integrity sha512-GqitS2Nab8ah0+wfCqaxW1hnI1piC08FimL6+lM9YWK5DbCOOF82IapbvJOy0feUmd/wNnHmyNTgE9h0zVMFdQ== + +sass-embedded-linux-musl-riscv64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.80.6.tgz#aaa086a6ce9718d0fd7cbe584c0f2bf81bef3122" + integrity sha512-ySs15z7QSRRQK/aByEEqaJLYW/sTpfynefNPZCtsVNVEzNRwy+DRpxNChtxo+QjKq97ocXETbdG5KLik7QOTJg== + +sass-embedded-linux-musl-x64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.6.tgz#ea0bb093837be3b6f473b9a1b5d09c4633f8e504" + integrity sha512-DzeNqU/SN0mWFznoOH4RtVGcrg3Eoa41pUQhKMtrhNbCmIE1zNDunUiAEVTNpdHJF4nxf7ELUPXWmStM31CbUQ== + +sass-embedded-linux-riscv64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.80.6.tgz#bc19c15796a3b3a3d67ea626058b3bab48344b1d" + integrity sha512-AyoHJ3icV9xuJjq1YzJqpEj2XfiC/KBkVYTUrCELKiXP0DN1gi/BpUwZNCAgCM3CyEdMef4LQM/ztCYJxYzdyg== + +sass-embedded-linux-x64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.6.tgz#db076fdf0bc3c1382c8f73c8d396293b893b31ef" + integrity sha512-EohsE9CEqx0ycylnsEj/0DNPG99Tb0qAVZspiAs5xHFCJjXOFfp3cRQu0BRf+lZ1b72IhPFXymzVtojvzUHb7g== + +sass-embedded-win32-arm64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.80.6.tgz#e889c421b0b31e1297414dd89448385fe443d5e2" + integrity sha512-29wETQi1ykeVvpd4zMVokpQKFSOZskGJzZawuuNCdo7BHjHKIRDsqbz8YT1CewHPBshI0hfD21fenmjxYjGXPQ== + +sass-embedded-win32-ia32@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.80.6.tgz#0934f3598e4fbe701b5e4e4d2a1fa6ef952f7024" + integrity sha512-1s3OpK2iTIfIL/a91QhAQnffsbuWfnsM8Lx4Fxt0f7ErnxjCV6q8MUFTV/UhcLtLyTFnPCA62DLjp2KGCjMI9A== + +sass-embedded-win32-x64@1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.80.6.tgz#b7357b399c12cbb80dab2bee6f541b88a6015d76" + integrity sha512-0pH4Zr9silHkcmLPC0ghnD3DI0vMsjA7dKvGR32/RbbjOSvHV5cDQRLiuVJAPp34dfMA7kJd1ysSchRdH0igAQ== + +sass-embedded@^1.80.6: + version "1.80.6" + resolved "https://registry.yarnpkg.com/sass-embedded/-/sass-embedded-1.80.6.tgz#efd66c12c7f117c2dcb558e8bf6bd00cc5cd49b2" + integrity sha512-Og4aqBnaA3oJfIpHaLuNATAqzBRgUJDYJy2X15V59cot2wYOtiT/ciPnyuq1o7vpDEeOkHhEd+mSviSlXoETug== + dependencies: + "@bufbuild/protobuf" "^2.0.0" + buffer-builder "^0.2.0" + colorjs.io "^0.5.0" + immutable "^4.0.0" + rxjs "^7.4.0" + supports-color "^8.1.1" + varint "^6.0.0" + optionalDependencies: + sass-embedded-android-arm "1.80.6" + sass-embedded-android-arm64 "1.80.6" + sass-embedded-android-ia32 "1.80.6" + sass-embedded-android-riscv64 "1.80.6" + sass-embedded-android-x64 "1.80.6" + sass-embedded-darwin-arm64 "1.80.6" + sass-embedded-darwin-x64 "1.80.6" + sass-embedded-linux-arm "1.80.6" + sass-embedded-linux-arm64 "1.80.6" + sass-embedded-linux-ia32 "1.80.6" + sass-embedded-linux-musl-arm "1.80.6" + sass-embedded-linux-musl-arm64 "1.80.6" + sass-embedded-linux-musl-ia32 "1.80.6" + sass-embedded-linux-musl-riscv64 "1.80.6" + sass-embedded-linux-musl-x64 "1.80.6" + sass-embedded-linux-riscv64 "1.80.6" + sass-embedded-linux-x64 "1.80.6" + sass-embedded-win32-arm64 "1.80.6" + sass-embedded-win32-ia32 "1.80.6" + sass-embedded-win32-x64 "1.80.6" + sass-loader@^12.3.0: version "12.6.0" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" @@ -10132,7 +10288,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -10430,6 +10586,11 @@ tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.2: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== +tslib@^2.1.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -10733,6 +10894,11 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" -- GitLab From 9b467a251af60fda9dc70bb392446ec0ac1a9979 Mon Sep 17 00:00:00 2001 From: matthiasf <matthias.feyll@@stud.h-da.de> Date: Mon, 25 Nov 2024 18:32:03 +0100 Subject: [PATCH 34/78] add menu provider --- .../src/i18n/locales/en/translations.json | 6 + react-ui/src/index.tsx | 7 +- .../json_viewer/view/json_viewer.scss | 27 +++- .../json_viewer/view/json_viewer.view.tsx | 50 ++++++- .../shared/provider/menu/menu.provider.scss | 11 ++ .../shared/provider/menu/menu.provider.tsx | 124 ++++++++++++++++++ react-ui/src/shared/utils/functions.ts | 8 ++ 7 files changed, 219 insertions(+), 14 deletions(-) create mode 100644 react-ui/src/shared/provider/menu/menu.provider.scss create mode 100644 react-ui/src/shared/provider/menu/menu.provider.tsx create mode 100644 react-ui/src/shared/utils/functions.ts diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index b58b299b1..c5e037548 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -4,8 +4,14 @@ "form": { "submit": "Submit", "empty_field": "This field can´t be empty" + }, + "toast": { + "copied": "Copied to clipboard" } }, + "json_viewer": { + "copy": "Copy" + }, "login": { "form": { "failed": "The username or password is invalid", diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 384f33d82..2d157fd9b 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,3 +1,4 @@ +import { MenuProvider } from '@provider/menu/menu.provider' import i18next from 'i18next' import React from 'react' import ReactDOM from 'react-dom/client' @@ -25,8 +26,10 @@ ReactDOM.createRoot(document.getElementById("root")).render( <Provider store={store}> <PersistGate loading={null} persistor={persistor}> <I18nextProvider i18n={i18next}> - {installToastify()} - <RouterProvider router={router} /> + <MenuProvider> + {installToastify()} + <RouterProvider router={router} /> + </MenuProvider> </I18nextProvider> </PersistGate> </Provider> diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss index 387290aaf..649f57e39 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss @@ -11,7 +11,7 @@ color: lighten(map-get($map: $theme-colors, $key: "black"), 20%) !important; background-color: white !important; border: 0; - padding: 0.1em 0 !important; + padding: 0.2em 0 !important; } & > td:nth-child(2) { @@ -21,6 +21,19 @@ &:hover > td { background-color: map-get($theme-colors, "primary::hover") !important; } + + &:hover .icons { + color: map-get($theme-colors, "black") !important; + opacity: 100%; + transition: gap 0.3s; + gap: 0.7em; + } + + & > .text-end { + vertical-align: middle; + padding-top: 0 !important; + padding-right: 5px !important; + } } .list-item-td.object { @@ -28,10 +41,6 @@ color: map-get($map: $theme-colors, $key: "black") !important; } - &:not(:first-child) > td { - padding-top: 0.5em !important; - } - &:hover { cursor: pointer; } @@ -45,3 +54,11 @@ td .icon { font-size: 0.8em; } + +.icons { + color: lighten(map-get($map: $theme-colors, $key: "dark"), 20%); + gap: 0.5em; + opacity: 0%; + + min-width: 3em; +} diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index 39bdb8738..840784c0f 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -1,8 +1,10 @@ -import { faAlignRight } from "@fortawesome/free-solid-svg-icons" +import { faAlignRight, faCopy, faPenToSquare, faTrashCan } from "@fortawesome/free-solid-svg-icons" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" -import { useAppDispatch } from "@hooks" -import React, { Suspense, useMemo } from "react" +import { useMenu } from "@provider/menu/menu.provider" +import { toClipboard } from "@utils/functions" +import React, { Suspense, useEffect, useMemo, useRef } from "react" import { Table } from "react-bootstrap" +import { useTranslation } from "react-i18next" import { useJsonViewer } from "../viewmodel/json_viewer.viewmodel" import './json_viewer.scss' @@ -12,7 +14,36 @@ type JsonViewerProbs = { export const JsonViewer = ({ json }: JsonViewerProbs) => { const { getSubset, breadcrumbs, isCollapsed, collapseable, collapse } = useJsonViewer(); - const dispatch = useAppDispatch(); + const { subscribe } = useMenu(); + const htmlContainer = useRef(null); + const { t } = useTranslation('common'); + + useEffect(() => { + if (htmlContainer.current) { + const subscription = subscribe({ + target: htmlContainer.current, + actions: [ + { + key: t('json_viewer.copy'), + icon: faCopy, + action: (clickedElement) => { + let parent = clickedElement; + while (parent && parent.tagName !== 'TR') { + parent = parent.parentNode; + } + + const copyValue = parent.dataset.copyValue + toClipboard(copyValue) + } + } + ] + }) + + return () => { + subscription.unsubscribe(); + } + } + }, []) const breadcrumbHTML = useMemo(() => { return ( @@ -46,10 +77,15 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { return ( <React.Fragment key={`${nested}-${key}`}> - <tr className={"list-item-td " + key + " " + nested + " " + (isObject ? 'object' : '')} onClick={() => { isObject ? collapse(key, nested, value) : null }} > + <tr className={"list-item-td " + key + " " + nested + " " + (isObject ? 'object' : '')} data-copy-value={readableValue} onClick={() => { isObject ? collapse(key, nested, value) : null }} > <td style={{ marginLeft: tabs + 'em' }} className={"d-flex align-items-center "}>{icon}<span> {key}</span></td> <td>{readableValue}</td> - <td className="text-end">comands</td> + <td className="text-end"> + <div className="d-flex icons justify-content-end align-items-center"> + <FontAwesomeIcon icon={faPenToSquare} size="sm" /> + <FontAwesomeIcon icon={faTrashCan} size="sm" /> + </div> + </td> </tr > {isObject && collapsed ? renderInner(value, nested + 1) : ''} </React.Fragment > @@ -83,7 +119,7 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { }, [json, collapseable]) return ( - <div> + <div ref={htmlContainer}> {breadcrumbHTML} {hierarchyHTML} </div> diff --git a/react-ui/src/shared/provider/menu/menu.provider.scss b/react-ui/src/shared/provider/menu/menu.provider.scss new file mode 100644 index 000000000..12393085a --- /dev/null +++ b/react-ui/src/shared/provider/menu/menu.provider.scss @@ -0,0 +1,11 @@ +.menu-container { + box-shadow: 0px 0px 5px gray; + + border-radius: 4px !important; +} + +.menu-button { + & > span { + margin-left: 10px; + } +} diff --git a/react-ui/src/shared/provider/menu/menu.provider.tsx b/react-ui/src/shared/provider/menu/menu.provider.tsx new file mode 100644 index 000000000..3d3aebc4a --- /dev/null +++ b/react-ui/src/shared/provider/menu/menu.provider.tsx @@ -0,0 +1,124 @@ +import { IconDefinition } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { createContext, useContext, useEffect, useMemo, useState } from "react"; +import './menu.provider.scss'; + +interface MenuSubscription { + unsubscribe: () => void +} + +// describes a action decorated with a item name +// on click the action is getting executed +type Action = { + key: string, + icon: IconDefinition, + action: (clickedHtmlElement: HTMLElement | undefined) => void +} + +interface MenuProviderType { + subscribe: (value: SubscriptionValue) => MenuSubscription +} + +const MenuContext = createContext<MenuProviderType>({ + subscribe: function (value: SubscriptionValue): MenuSubscription { + throw new Error("Function not implemented."); + } +}) + +interface SubscriptionValue { + target: HTMLElement, + actions: Array<Action> +} + + +export const MenuProvider = ({ children }) => { + const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 }); + const [showMenu, setShowMenu] = useState(false); + const [subscribedTargets, setSubscribedTargets] = useState<Array<SubscriptionValue>>([]) + + const [menuItems, setMenuItems] = useState<Array<SubscriptionValue>>([]); + const [clickedHtmlElement, setClickedHtmlElement] = useState<HTMLElement>() + + const handleContextMenu = (event) => { + event.preventDefault(); + const targets = subscribedTargets.filter(({ target }) => target.contains(event.target)) + + setMenuPosition({ top: event.pageY, left: event.pageX }); + setMenuItems(targets) + setClickedHtmlElement(event.target) + displayMenu() + }; + + const displayMenu = () => { + setShowMenu(true); + } + + const hideMenu = () => { + setShowMenu(false); + setMenuItems([]); + } + + const handleClick = () => hideMenu(); + + useEffect(() => { + document.addEventListener('keyup', (e) => { + if (e.code === "Escape") { + hideMenu(); + } + }); + }, []) + + const value = useMemo<MenuProviderType>(() => { + return { + subscribe(target) { + const index = subscribedTargets.length; + + setSubscribedTargets([...subscribedTargets, target]) + + const subscription: MenuSubscription = { + unsubscribe() { + setSubscribedTargets([...subscribedTargets.splice(index, 1)]) + }, + } + return subscription + }, + } as MenuProviderType + }, []) + + return ( + <MenuContext.Provider value={value}> + <div onContextMenu={handleContextMenu} onClick={handleClick} style={{ height: "100vh" }}> + <div + className={`menu-container dropdown-menu ${showMenu ? "show" : ""}`} + style={{ position: "absolute", top: `${menuPosition.top}px`, left: `${menuPosition.left}px` }} + > + { + menuItems.map((item, i) => { + // for each new action array (for each new subscription entity) draw a seperator line except the last action + const seperator = i < menuItems.length - 1 ? (<li><hr className="dropdown-divider"></hr></li>) : (<React.Fragment key={i}></React.Fragment>) + + const dropdownItems = item.actions.map(({ action, icon, key }) => { + + const disabled = !(clickedHtmlElement instanceof HTMLElement) || !clickedHtmlElement?.textContent + + return ( + <button className="menu-button dropdown-item" key={key + " " + i} disabled={disabled} onClick={() => action(clickedHtmlElement)}> + <FontAwesomeIcon icon={icon} size="sm" /> + <span>{key}</span> + </button> + ) + }) + + return [...dropdownItems, seperator] + }) + } + </div> + {children} + </div> + </MenuContext.Provider> + ) +} + +export const useMenu = () => { + return useContext(MenuContext) +} \ No newline at end of file diff --git a/react-ui/src/shared/utils/functions.ts b/react-ui/src/shared/utils/functions.ts new file mode 100644 index 000000000..e4cd80c17 --- /dev/null +++ b/react-ui/src/shared/utils/functions.ts @@ -0,0 +1,8 @@ +import { t } from "i18next"; +import { toast } from "react-toastify"; + + +export const toClipboard = (text: string) => { + navigator.clipboard.writeText(text); + toast.info(t('global.toast.copied')) +} \ No newline at end of file -- GitLab From 77b1c688044ba4e85e4a22c03f251d94d588c65f Mon Sep 17 00:00:00 2001 From: matthiasf <matthias.feyll@@stud.h-da.de> Date: Mon, 25 Nov 2024 19:17:06 +0100 Subject: [PATCH 35/78] add utils provider --- react-ui/src/index.tsx | 11 +++--- .../json_viewer/view/json_viewer.view.tsx | 3 +- .../src/shared/provider/utils.provider.tsx | 36 +++++++++++++++++++ react-ui/src/shared/utils/functions.ts | 8 ----- 4 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 react-ui/src/shared/provider/utils.provider.tsx delete mode 100644 react-ui/src/shared/utils/functions.ts diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 2d157fd9b..48f57dcff 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,4 +1,5 @@ import { MenuProvider } from '@provider/menu/menu.provider' +import { UtilsProvider } from '@provider/utils.provider' import i18next from 'i18next' import React from 'react' import ReactDOM from 'react-dom/client' @@ -26,10 +27,12 @@ ReactDOM.createRoot(document.getElementById("root")).render( <Provider store={store}> <PersistGate loading={null} persistor={persistor}> <I18nextProvider i18n={i18next}> - <MenuProvider> - {installToastify()} - <RouterProvider router={router} /> - </MenuProvider> + <UtilsProvider> + <MenuProvider> + {installToastify()} + <RouterProvider router={router} /> + </MenuProvider> + </UtilsProvider> </I18nextProvider> </PersistGate> </Provider> diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index 840784c0f..9462fa4db 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -1,7 +1,7 @@ import { faAlignRight, faCopy, faPenToSquare, faTrashCan } from "@fortawesome/free-solid-svg-icons" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" import { useMenu } from "@provider/menu/menu.provider" -import { toClipboard } from "@utils/functions" +import { useUtils } from "@provider/utils.provider" import React, { Suspense, useEffect, useMemo, useRef } from "react" import { Table } from "react-bootstrap" import { useTranslation } from "react-i18next" @@ -17,6 +17,7 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { const { subscribe } = useMenu(); const htmlContainer = useRef(null); const { t } = useTranslation('common'); + const { toClipboard } = useUtils(); useEffect(() => { if (htmlContainer.current) { diff --git a/react-ui/src/shared/provider/utils.provider.tsx b/react-ui/src/shared/provider/utils.provider.tsx new file mode 100644 index 000000000..e9a83034e --- /dev/null +++ b/react-ui/src/shared/provider/utils.provider.tsx @@ -0,0 +1,36 @@ +import { createContext, useContext, useMemo } from "react"; +import { useTranslation } from "react-i18next"; +import { toast } from "react-toastify"; + +interface UtilsProviderType { + toClipboard: (text: string) => void +} + +const UtilsContext = createContext<UtilsProviderType>({ + toClipboard: function (text: string): void { + throw new Error("Function not implemented."); + } +}) + +export const UtilsProvider = ({ children }) => { + const { t } = useTranslation('common'); + + const value = useMemo<UtilsProviderType>(() => { + return { + toClipboard(text) { + navigator.clipboard.writeText(text); + toast.info(t('global.toast.copied')) + }, + } as UtilsProviderType + }, []) + + return ( + <UtilsContext.Provider value={value}> + {children} + </UtilsContext.Provider> + ) +} + +export const useUtils = () => { + return useContext(UtilsContext) +} \ No newline at end of file diff --git a/react-ui/src/shared/utils/functions.ts b/react-ui/src/shared/utils/functions.ts deleted file mode 100644 index e4cd80c17..000000000 --- a/react-ui/src/shared/utils/functions.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { t } from "i18next"; -import { toast } from "react-toastify"; - - -export const toClipboard = (text: string) => { - navigator.clipboard.writeText(text); - toast.info(t('global.toast.copied')) -} \ No newline at end of file -- GitLab From 7524902295815331af009be2f0afd426cf852377 Mon Sep 17 00:00:00 2001 From: matthiasf <matthias.feyll@@stud.h-da.de> Date: Fri, 6 Dec 2024 02:25:27 +0100 Subject: [PATCH 36/78] wip_search_complete --- react-ui/src/index.tsx | 8 +- .../json_viewer/view/json_viewer.scss | 4 + .../json_viewer/view/json_viewer.view.tsx | 77 ++++++------- .../viewmodel/json_viewer.viewmodel.tsx | 104 +++++++++++++++++- react-ui/src/shared/helper/hash.ts | 11 ++ 5 files changed, 153 insertions(+), 51 deletions(-) create mode 100644 react-ui/src/shared/helper/hash.ts diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 48f57dcff..186138b89 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -16,12 +16,6 @@ import { router } from './routes' import './shared/icons/icons' import { persistor, store } from './stores' -const installToastify = () => { - return ( - <ToastContainer /> - ) -}; - ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> <Provider store={store}> @@ -29,7 +23,7 @@ ReactDOM.createRoot(document.getElementById("root")).render( <I18nextProvider i18n={i18next}> <UtilsProvider> <MenuProvider> - {installToastify()} + <ToastContainer /> <RouterProvider router={router} /> </MenuProvider> </UtilsProvider> diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss index 649f57e39..d5b33cf98 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss @@ -34,6 +34,10 @@ padding-top: 0 !important; padding-right: 5px !important; } + + & > .text-element { + max-width: 100px; + } } .list-item-td.object { diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index 9462fa4db..635cad6ea 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -1,9 +1,7 @@ -import { faAlignRight, faCopy, faPenToSquare, faTrashCan } from "@fortawesome/free-solid-svg-icons" +import { faAlignRight, faPenToSquare, faTrashCan } from "@fortawesome/free-solid-svg-icons" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" -import { useMenu } from "@provider/menu/menu.provider" -import { useUtils } from "@provider/utils.provider" -import React, { Suspense, useEffect, useMemo, useRef } from "react" -import { Table } from "react-bootstrap" +import React, { Suspense, useMemo, useRef } from "react" +import { Form, Table } from "react-bootstrap" import { useTranslation } from "react-i18next" import { useJsonViewer } from "../viewmodel/json_viewer.viewmodel" import './json_viewer.scss' @@ -13,38 +11,11 @@ type JsonViewerProbs = { } export const JsonViewer = ({ json }: JsonViewerProbs) => { - const { getSubset, breadcrumbs, isCollapsed, collapseable, collapse } = useJsonViewer(); - const { subscribe } = useMenu(); - const htmlContainer = useRef(null); const { t } = useTranslation('common'); - const { toClipboard } = useUtils(); + const htmlContainer = useRef(null); + const search = useRef<HTMLInputElement>(null); - useEffect(() => { - if (htmlContainer.current) { - const subscription = subscribe({ - target: htmlContainer.current, - actions: [ - { - key: t('json_viewer.copy'), - icon: faCopy, - action: (clickedElement) => { - let parent = clickedElement; - while (parent && parent.tagName !== 'TR') { - parent = parent.parentNode; - } - - const copyValue = parent.dataset.copyValue - toClipboard(copyValue) - } - } - ] - }) - - return () => { - subscription.unsubscribe(); - } - } - }, []) + const { getSubset, breadcrumbs, isCollapsed, collapseable, collapse, parameterizedJson, searchTerm } = useJsonViewer({ json, search, container: htmlContainer }); const breadcrumbHTML = useMemo(() => { return ( @@ -59,8 +30,17 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { }, [breadcrumbs]) - const renderInner = (innerJson: JSON, nested: number = 0): JSX.Element => { + const renderInner = (innerJson: JSON, nested: number = 0, path: string = "/network-instance/0/"): JSX.Element => { return Object.entries(innerJson).map(([key, value]): JSX.Element => { + if (searchTerm !== "") { + path += key + "/" + const is = parameterizedJson.current.filter(_path => _path === path)[0] + + if (!is) { + return (<></>) + } + } + const isObject = value instanceof Object; const readableValue = isObject ? '' : value; @@ -69,7 +49,6 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { const icon = isObject ? <span className={collapsed ? 'fa-rotate-90' : ''}>></span> : <FontAwesomeIcon className="icon fa-rotate-180" icon={faAlignRight} size="xs" /> - // determine the margin-left: n indent let tabs = 0.0; for (let i = 0; i < nested; i++) { @@ -78,9 +57,13 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { return ( <React.Fragment key={`${nested}-${key}`}> - <tr className={"list-item-td " + key + " " + nested + " " + (isObject ? 'object' : '')} data-copy-value={readableValue} onClick={() => { isObject ? collapse(key, nested, value) : null }} > + <tr + className={"list-item-td " + key + " " + nested + " " + (isObject ? 'object' : '')} + data-copy-value={readableValue} + onClick={() => { isObject ? collapse(key, nested, value) : null }} + > <td style={{ marginLeft: tabs + 'em' }} className={"d-flex align-items-center "}>{icon}<span> {key}</span></td> - <td>{readableValue}</td> + <td className="text-element text-truncate">{readableValue}</td> <td className="text-end"> <div className="d-flex icons justify-content-end align-items-center"> <FontAwesomeIcon icon={faPenToSquare} size="sm" /> @@ -88,13 +71,12 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { </div> </td> </tr > - {isObject && collapsed ? renderInner(value, nested + 1) : ''} + {isObject && collapsed ? renderInner(value, nested + 1, path) : ''} </React.Fragment > ) }) } - const renderJson = (json: JSON): JSX.Element => { return ( <Table className="list-group-tr"> @@ -117,10 +99,21 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { </Suspense> </> ) - }, [json, collapseable]) + }, [json, collapseable, searchTerm]) + + const searchHTML = () => { + return ( + <> + <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> + <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={search} /> + </Form.Group> + </> + ) + } return ( <div ref={htmlContainer}> + {searchHTML()} {breadcrumbHTML} {hierarchyHTML} </div> diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index d7ccd5d5a..2ad0f0a6b 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -1,4 +1,9 @@ +import { faCopy } from "@fortawesome/free-solid-svg-icons"; import { useAppDispatch, useAppSelector } from "@hooks"; +import { useMenu } from "@provider/menu/menu.provider"; +import { useUtils } from "@provider/utils.provider"; +import React, { MutableRefObject, useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; import { compareIdentifier, toggleCollapse } from "../reducer/json_viewer.reducer"; export enum CollapseValues { @@ -7,10 +12,25 @@ export enum CollapseValues { TRUE } +interface JsonViewerViewModelType { + json: JSON, + search: React.RefObject<HTMLInputElement>, + container: React.RefObject<HTMLElement> +} + +export const MARKED = "?marked" -export const useJsonViewer = () => { +export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelType) => { const { breadcrumbs, collapseContainer } = useAppSelector(state => state.json_viwer) const dispatch = useAppDispatch(); + const [searchTerm, setSearchTerm] = useState(''); + const { toClipboard } = useUtils(); + const { t } = useTranslation('common'); + const { subscribe } = useMenu(); + + // Map that contains a filtered key list with all keys that are found by the searchTerm + // The number represents + const parameterizedJsonMap = useRef<Array<string>>([]); const getSubset = (json: JSON) => { @@ -42,14 +62,94 @@ export const useJsonViewer = () => { if (keys.length === 1) { collapse(keys[0], nested + 1, json[keys[0]], CollapseValues.TRUE) } + } + + const handleSearchInput = () => { + setSearchTerm(search.current!.value) + } + + const registerMenuOptions = () => { + if (container.current) { + const subscription = subscribe({ + target: container.current, + actions: [ + { + key: t('json_viewer.copy'), + icon: faCopy, + action: (clickedElement) => { + let parent = clickedElement; + while (parent && parent.tagName !== 'TR') { + parent = parent.parentNode; + } + + const copyValue = parent.dataset.copyValue + toClipboard(copyValue) + } + } + ] + }) + + return () => { + subscription.unsubscribe(); + } + } + } + + const innerSearch = (json: Object, searchValue: string, path: string = "/"): boolean => { + let found = false; + path = JSON.parse(JSON.stringify(path)) + + for (const [key, childJson] of Object.entries(json)) { + path += key + "/" + if (!(childJson instanceof Object)) { + const marked = key.includes(searchValue) || childJson.includes(searchValue); + if (marked) { + parameterizedJsonMap.current.push(path) + found = true + } + + continue + } + + const marked = innerSearch(childJson, searchValue, JSON.parse(JSON.stringify(path))); + if (marked) { + found = true + parameterizedJsonMap.current.push(path) + } + } + return found } + const parameterizedJson = useMemo<MutableRefObject<Array<string>>>(() => { + parameterizedJsonMap.current = [] + if (searchTerm === "") { + return json + } + + innerSearch(json, searchTerm); + return parameterizedJsonMap + }, [searchTerm]) + + useEffect(() => { + registerMenuOptions(); + + if (search.current) { + search.current.addEventListener('input', handleSearchInput) + } + + return () => { + search.current!.removeEventListener('input', handleSearchInput) + } + }, []) + return { getSubset, breadcrumbs, collapseable: collapseContainer, isCollapsed, - collapse + collapse, + searchTerm, + parameterizedJson } } \ No newline at end of file diff --git a/react-ui/src/shared/helper/hash.ts b/react-ui/src/shared/helper/hash.ts new file mode 100644 index 000000000..e185c87a5 --- /dev/null +++ b/react-ui/src/shared/helper/hash.ts @@ -0,0 +1,11 @@ +export const stringToHash = (text: string): number => { + let hash = 0; + + if (text.length === 0) return hash; + + for (const char of text) { + hash ^= char.charCodeAt(0); + } + + return hash; +} \ No newline at end of file -- GitLab From 44b358b11eb90c927bfeaf235f069b3a42c180b7 Mon Sep 17 00:00:00 2001 From: matthiasf <matthias.feyll@@stud.h-da.de> Date: Tue, 10 Dec 2024 15:24:55 +0100 Subject: [PATCH 37/78] ui: implement json viewer search --- react-ui/package.json | 1 + .../json_viewer/view/json_viewer.scss | 4 ++ .../json_viewer/view/json_viewer.view.tsx | 56 ++++++++++++++----- .../viewmodel/json_viewer.viewmodel.tsx | 21 +++++-- react-ui/yarn.lock | 9 ++- 5 files changed, 69 insertions(+), 22 deletions(-) diff --git a/react-ui/package.json b/react-ui/package.json index 57c152ac4..951b1c216 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -10,6 +10,7 @@ "@fortawesome/react-fontawesome": "^0.2.2", "@reduxjs/toolkit": "^2.2.4", "bootstrap": "^5.3.3", + "dompurify": "^3.2.3", "i18next": "^23.11.5", "jwt-decode": "^4.0.0", "react": "^18.3.1", diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss index d5b33cf98..20befdcbb 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss @@ -66,3 +66,7 @@ td .icon { min-width: 3em; } + +span.highlight { + background-color: darken(yellow, $amount: 0.5); +} diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index 635cad6ea..720f75c7d 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -1,5 +1,6 @@ import { faAlignRight, faPenToSquare, faTrashCan } from "@fortawesome/free-solid-svg-icons" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" +import DOMPurify from 'dompurify' import React, { Suspense, useMemo, useRef } from "react" import { Form, Table } from "react-bootstrap" import { useTranslation } from "react-i18next" @@ -29,22 +30,33 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { ) }, [breadcrumbs]) + const insertMarkTags = (text: string, search: string): string => { + const start = text.indexOf(search) + const end = start + search.length - const renderInner = (innerJson: JSON, nested: number = 0, path: string = "/network-instance/0/"): JSX.Element => { - return Object.entries(innerJson).map(([key, value]): JSX.Element => { + return DOMPurify.sanitize(text.substring(0, start)) + "<span class='highlight'>" + DOMPurify.sanitize(search) + "</span>" + DOMPurify.sanitize(text.substring(end, text.length)) + } + + const renderInner = (innerJson: JSON, nested: number = 0, parentKey: string = "", path: string = "/network-instance/0/"): JSX.Element => { + path += parentKey + (parentKey === "" ? "" : "/") + + return Object.entries(innerJson).map(([key, child]): JSX.Element => { + let collapsed = isCollapsed(key, nested); + + // display only keys and values that matches if (searchTerm !== "") { - path += key + "/" - const is = parameterizedJson.current.filter(_path => _path === path)[0] + const foundPaths = parameterizedJson.current.filter(_path => _path === path) - if (!is) { - return (<></>) - } + //collapsed = !collapsed ? !!foundPaths.length : collapsed + collapsed = !!foundPaths.length } - const isObject = value instanceof Object; - const readableValue = isObject ? '' : value; + const isObject = child instanceof Object; + let readableValue: string = isObject ? '' : DOMPurify.sanitize(child); - const collapsed = isCollapsed(key, nested); + if (searchTerm !== "" && readableValue.includes(searchTerm)) { + readableValue = insertMarkTags(readableValue, searchTerm) + } const icon = isObject ? <span className={collapsed ? 'fa-rotate-90' : ''}>></span> : <FontAwesomeIcon className="icon fa-rotate-180" icon={faAlignRight} size="xs" /> @@ -52,7 +64,21 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { // determine the margin-left: n indent let tabs = 0.0; for (let i = 0; i < nested; i++) { - tabs += 0.3; + tabs += 0.4; + } + + let concatenatedKey = key + let innerChild = child + while (innerChild.length === 1) { + const innerKey = Object.keys(innerChild)[0] + concatenatedKey += '/' + innerKey + innerChild = innerChild[innerKey] + } + + concatenatedKey = DOMPurify.sanitize(concatenatedKey) + + if (searchTerm !== "" && concatenatedKey.includes(searchTerm)) { + concatenatedKey = insertMarkTags(concatenatedKey, searchTerm) } return ( @@ -60,10 +86,10 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { <tr className={"list-item-td " + key + " " + nested + " " + (isObject ? 'object' : '')} data-copy-value={readableValue} - onClick={() => { isObject ? collapse(key, nested, value) : null }} + onClick={() => { isObject ? collapse(key, nested, child) : null }} > - <td style={{ marginLeft: tabs + 'em' }} className={"d-flex align-items-center "}>{icon}<span> {key}</span></td> - <td className="text-element text-truncate">{readableValue}</td> + <td style={{ marginLeft: tabs + 'em' }} className={"d-flex align-items-center "}>{icon}<span> <span dangerouslySetInnerHTML={{ __html: concatenatedKey }} /></span></td> + <td className="text-element text-truncate" dangerouslySetInnerHTML={{ __html: readableValue }}></td> <td className="text-end"> <div className="d-flex icons justify-content-end align-items-center"> <FontAwesomeIcon icon={faPenToSquare} size="sm" /> @@ -71,7 +97,7 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { </div> </td> </tr > - {isObject && collapsed ? renderInner(value, nested + 1, path) : ''} + {isObject && collapsed ? renderInner(innerChild, nested + 1, concatenatedKey, path) : ''} </React.Fragment > ) }) diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index 2ad0f0a6b..a1a9c8977 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -95,23 +95,30 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy } } - const innerSearch = (json: Object, searchValue: string, path: string = "/"): boolean => { + const innerSearch = (json: Object, searchValue: string, parentKey: string = "", path: string = "/"): boolean => { let found = false; - path = JSON.parse(JSON.stringify(path)) + path += parentKey + (parentKey === "" ? "" : "/") for (const [key, childJson] of Object.entries(json)) { - path += key + "/" + // leaf if (!(childJson instanceof Object)) { const marked = key.includes(searchValue) || childJson.includes(searchValue); if (marked) { - parameterizedJsonMap.current.push(path) + parameterizedJsonMap.current.push(path + key) found = true } continue } - const marked = innerSearch(childJson, searchValue, JSON.parse(JSON.stringify(path))); + if (key.includes(searchValue)) { + parameterizedJsonMap.current.push(path + key) + found = true + } + + const marked = innerSearch(childJson, searchValue, key, path); + + // if found in some child leaf save the parent if (marked) { found = true parameterizedJsonMap.current.push(path) @@ -139,7 +146,9 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy } return () => { - search.current!.removeEventListener('input', handleSearchInput) + if (search.current) { + search.current.removeEventListener('input', handleSearchInput) + } } }, []) diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 5d2d968a7..d60413ed6 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -2676,7 +2676,7 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/trusted-types@^2.0.2": +"@types/trusted-types@^2.0.2", "@types/trusted-types@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== @@ -4656,6 +4656,13 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +dompurify@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.3.tgz#05dd2175225324daabfca6603055a09b2382a4cd" + integrity sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" -- GitLab From 38351208b07076569a3b6ce7269939a2dfe747b5 Mon Sep 17 00:00:00 2001 From: matthiasf <matthias.feyll@@stud.h-da.de> Date: Tue, 10 Dec 2024 15:24:55 +0100 Subject: [PATCH 38/78] ui: implement json viewer search --- react-ui/.gitignore | 2 ++ react-ui/dist/assets/logo-Bj6KFr1z.svg | 17 ----------------- react-ui/dist/favicon.ico | Bin 3870 -> 0 bytes react-ui/dist/fonts/Inter.ttf | Bin 804612 -> 0 bytes react-ui/dist/index.html | 22 ---------------------- react-ui/dist/logo.png | Bin 66912 -> 0 bytes react-ui/dist/logo.svg | 17 ----------------- react-ui/dist/manifest.json | 20 -------------------- react-ui/dist/robots.txt | 3 --- 9 files changed, 2 insertions(+), 79 deletions(-) delete mode 100755 react-ui/dist/assets/logo-Bj6KFr1z.svg delete mode 100755 react-ui/dist/favicon.ico delete mode 100755 react-ui/dist/fonts/Inter.ttf delete mode 100755 react-ui/dist/index.html delete mode 100755 react-ui/dist/logo.png delete mode 100755 react-ui/dist/logo.svg delete mode 100755 react-ui/dist/manifest.json delete mode 100755 react-ui/dist/robots.txt diff --git a/react-ui/.gitignore b/react-ui/.gitignore index 6b5757776..5ec5a7340 100755 --- a/react-ui/.gitignore +++ b/react-ui/.gitignore @@ -14,6 +14,8 @@ # production /build +/dist +.vite/ # misc .DS_Store diff --git a/react-ui/dist/assets/logo-Bj6KFr1z.svg b/react-ui/dist/assets/logo-Bj6KFr1z.svg deleted file mode 100755 index b7f71bd90..000000000 --- a/react-ui/dist/assets/logo-Bj6KFr1z.svg +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with Vectornator (http://vectornator.io/) --> -<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 113.4 212.625" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:vectornator="http://vectornator.io" xmlns:xlink="http://www.w3.org/1999/xlink"> -<defs> -<radialGradient cx="170.235" cy="146.046" gradientTransform="matrix(1.00001 -8.65109e-05 8.65119e-05 1 -115.465 -116.986)" gradientUnits="userSpaceOnUse" id="RadialGradient" r="217.591"> -<stop offset="0" stop-color="#c456f7"/> -<stop offset="1" stop-color="#34054a"/> -</radialGradient> -<filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="209.692" id="Filter" width="111.957" x="0.722269" y="2.46642"> -<feDropShadow dx="-4.37114e-08" dy="1" flood-color="#050505" flood-opacity="1" in="SourceGraphic" result="Shadow" stdDeviation="1"/> -</filter> -</defs> -<g id="Layer-1" vectornator:layerName="Layer 1"> -<path d="M35.1413 3.47016L35.1416 6.93891L27.1415 6.93961L27.1464 63.3771C21.6096 65.0011 16.4869 67.0445 12.2717 69.6596C-9.35807 83.0789 12.5182 123.232 12.5264 123.222C12.5341 123.213 12.5498 123.2 12.5576 123.191C13.1518 124.609 14.5144 125.761 16.5579 126.534C18.7737 127.372 21.8204 127.855 26.8082 128.408C25.0644 132.318 24.4639 137.732 25.3409 144.846C26.0816 150.854 28.2327 155.309 32.5924 161.533C32.9615 162.06 34.1761 163.796 34.3427 164.033C35.013 164.984 35.5416 165.705 35.9991 166.408C38.1084 169.647 39.1319 172.149 39.3124 174.814C39.3701 175.665 39.3355 180.513 39.251 187.751C39.2362 189.024 39.0999 200.614 39.0959 200.907C37.7122 201.653 36.7523 203.069 36.7525 204.751C36.7527 207.19 38.7205 209.157 41.1591 209.157C43.5978 209.157 45.5653 207.189 45.5651 204.751C45.5649 203.019 44.5477 201.568 43.096 200.844C43.1023 200.341 43.2363 189.045 43.2511 187.782C43.3388 180.268 43.3816 175.583 43.3124 174.563C43.0775 171.096 41.7912 168.012 39.3427 164.251C38.854 163.5 38.3197 162.708 37.6237 161.72C37.4507 161.474 36.2342 159.766 35.8735 159.251C31.8564 153.517 29.9529 149.563 29.3096 144.346C28.2621 135.848 29.4895 130.5 32.027 127.533C32.6413 126.815 33.2789 126.306 33.9019 125.97C34.2334 125.792 34.4442 125.7 34.4956 125.689C35.5735 125.448 36.2365 124.392 35.9954 123.314C35.7543 122.236 34.6982 121.542 33.6202 121.783C33.2264 121.871 32.6655 122.078 31.9953 122.439C31.0669 122.939 30.1635 123.734 29.3079 124.658C23.0392 124.019 20.0922 123.577 17.9951 122.784C16.1482 122.086 15.9773 121.63 16.7137 120.347C25.511 115.923 43.9287 113.157 55.0885 113.156C63.8081 113.155 79.7952 116.873 90.4333 119.622C93.9977 120.542 94.7294 120.755 96.621 121.277C94.2649 123.034 89.4439 124.738 83.3087 125.247C83.0835 125.266 82.9434 125.443 82.7462 125.529C82.6074 125.348 82.5171 125.106 82.3711 124.935C81.4271 123.831 80.3863 122.999 79.3396 122.435C78.6693 122.074 78.1085 121.867 77.7145 121.779C76.6365 121.538 75.5805 122.233 75.3396 123.31C75.0987 124.388 75.7619 125.444 76.8399 125.685C76.8913 125.697 77.1021 125.788 77.4337 125.967C78.0567 126.302 78.6942 126.81 79.3088 127.529C81.8468 130.496 83.0751 135.844 82.029 144.341C81.3867 149.559 79.4839 153.513 75.4678 159.248C75.1071 159.763 73.8909 161.471 73.7179 161.717C73.0221 162.705 72.488 163.498 71.9994 164.248C69.5516 168.009 68.2658 171.094 68.0315 174.561C67.9625 175.581 68.0061 180.266 68.0951 187.78C68.1102 189.055 68.2793 200.673 68.2838 200.967C66.9421 201.725 66.0027 203.098 66.0028 204.749C66.0031 207.187 67.9709 209.155 70.4095 209.155C72.8481 209.154 74.8156 207.187 74.8154 204.748C74.8153 202.975 73.7598 201.482 72.2526 200.779C72.2461 200.277 72.1101 189.009 72.0952 187.748C72.0095 180.511 71.974 175.662 72.0316 174.811C72.2116 172.146 73.2659 169.644 75.3746 166.404C75.8321 165.701 76.3292 164.981 76.9994 164.029C77.1659 163.793 78.3803 162.056 78.7492 161.529C83.1079 155.305 85.2582 150.849 85.9979 144.841C86.8306 138.077 86.2654 132.917 84.7153 129.06C93.073 128.178 99.944 125.471 101.777 121.527C105.258 116.592 120.674 81.4184 100.46 69.1833C96.4145 66.7344 91.6503 64.7196 86.3971 63.1845L86.3922 6.93448L78.3609 6.93517L78.3606 3.46642L35.1413 3.47016ZM31.1419 10.9393L39.1107 10.9386L39.3309 27.9386C39.3406 28.6841 39.9605 29.2606 40.7061 29.2509C41.4516 29.2413 42.0593 28.6214 42.0497 27.8758L41.7983 10.9383L44.517 10.9381L44.7998 27.9381C44.8108 28.6836 45.3981 29.2615 46.1436 29.2505C46.8892 29.2394 47.4983 28.6209 47.4873 27.8753L47.2358 10.9379L49.9546 10.9376L50.2061 27.9376C50.2169 28.6831 50.8357 29.2608 51.5812 29.25C52.3267 29.2392 52.9044 28.6203 52.8936 27.8749L52.6421 10.9374L55.3609 10.9372L55.6124 27.9371C55.623 28.6827 56.242 29.2601 56.9875 29.2495C57.733 29.2389 58.3418 28.6199 58.3312 27.8744L58.0797 10.9369L60.8297 10.9367L61.05 27.9367C61.0546 28.3094 61.2147 28.6381 61.4563 28.8741C61.6979 29.1102 62.0211 29.2537 62.3938 29.2491C63.1394 29.2398 63.7468 28.6194 63.7375 27.8739L63.5173 10.9365L66.2986 10.9362L66.4875 27.905C66.4957 28.6505 67.1171 29.2568 67.8627 29.2486C68.6082 29.2404 69.1834 28.6503 69.1751 27.9047L68.9861 10.936L71.7674 10.9357L71.9564 27.9357C71.9605 28.3085 72.1132 28.6372 72.3627 28.8732C72.6122 29.1091 72.9587 29.2523 73.3315 29.2481C74.077 29.2398 74.6833 28.6498 74.6751 27.9042L74.4862 10.9355L82.3925 10.9348L82.3969 62.2473C78.1953 61.2363 73.8195 60.4151 69.2716 59.936L69.0841 59.936L69.0846 65.9672L62.3352 73.3116L62.211 82.5928L62.212 94.7803L56.5244 94.7808L50.3056 94.7814L50.2733 82.9376L50.1163 73.3126L43.1468 65.8132L43.1463 60.0945L31.1463 62.3455L31.1419 10.9393ZM46.0197 41.188L45.9904 64.3755L52.9599 71.8749L53.1492 91.9374L59.368 91.9368L59.5225 71.8743L66.2407 64.5612L66.2387 41.3425L46.0197 41.188ZM45.5578 121.282C45.0484 121.232 44.5158 121.369 44.0891 121.719C43.2356 122.421 43.1382 123.71 43.8394 124.563C43.8712 124.602 43.9181 124.67 44.0269 124.813C44.2163 125.062 44.4521 125.354 44.6832 125.688C45.3494 126.65 45.998 127.755 46.621 128.938C48.9603 133.379 50.0248 137.836 49.1222 141.875C48.4351 144.95 46.6061 147.711 43.4353 150.126C43.1568 150.338 42.1644 150.942 40.7792 151.751C40.6905 151.803 37.4839 153.662 37.4356 153.689C36.4728 154.23 36.1131 155.445 36.6545 156.408C37.1959 157.37 38.4106 157.699 39.3734 157.157C39.4251 157.128 42.7199 155.272 42.8108 155.22C44.3781 154.304 45.4057 153.669 45.8731 153.313C49.7829 150.336 52.1324 146.76 53.0285 142.75C54.1746 137.622 52.9238 132.266 50.1834 127.063C49.4811 125.729 48.7181 124.526 47.9643 123.438C47.5056 122.775 47.1244 122.271 46.9017 122C46.5511 121.574 46.0673 121.332 45.5578 121.282ZM65.7769 121.28C65.2675 121.33 64.7837 121.572 64.4331 121.999C64.2105 122.27 63.8293 122.774 63.3708 123.436C62.6172 124.525 61.8858 125.728 61.1835 127.062C58.444 132.265 57.163 137.621 58.3099 142.749C59.2067 146.759 61.5569 150.335 65.4671 153.311C65.9346 153.667 66.9935 154.302 68.5611 155.217C68.6519 155.27 71.9158 157.125 71.9675 157.154C72.9304 157.696 74.145 157.367 74.6862 156.404C75.2275 155.441 74.8676 154.227 73.9048 153.686C73.8565 153.658 70.6495 151.8 70.5608 151.748C69.1754 150.939 68.1829 150.336 67.9044 150.124C64.7332 147.71 62.9036 144.948 62.2161 141.874C61.3128 137.835 62.3766 133.378 64.715 128.936C65.3378 127.753 65.9862 126.649 66.6522 125.686C66.8833 125.352 67.1191 125.06 67.3084 124.811C67.4172 124.668 67.4953 124.6 67.5272 124.561C68.2282 123.708 68.0992 122.418 67.2457 121.717C66.8189 121.367 66.2862 121.23 65.7769 121.28ZM28.3735 160.064C27.8641 160.114 27.3492 160.357 26.9985 160.783C24.0604 164.358 22.5881 168.723 22.5621 174.253C22.5614 174.404 22.6311 200.839 22.627 200.877C21.1966 201.608 20.1896 203.036 20.1898 204.753C20.19 207.191 22.1578 209.159 24.5964 209.159C27.0351 209.158 29.0026 207.191 29.0024 204.752C29.0022 203.061 28.0235 201.65 26.627 200.908C26.6562 200.425 26.6538 197.055 26.6259 187.658C26.6229 186.662 26.5615 174.385 26.5622 174.252C26.584 169.618 27.7563 166.157 30.0925 163.314C30.7939 162.461 30.6644 161.203 29.811 160.502C29.3844 160.151 28.8829 160.015 28.3735 160.064ZM82.9679 160.06C82.4585 160.01 81.9571 160.147 81.5304 160.497C80.6772 161.199 80.5479 162.457 81.2494 163.31C83.5862 166.152 84.7591 169.613 84.7817 174.247C84.7823 174.378 84.7241 199.67 84.7527 200.841C83.3011 201.564 82.2529 203.015 82.253 204.747C82.2533 207.186 84.2524 209.153 86.691 209.153C89.1295 209.153 91.0971 207.185 91.0969 204.747C91.0967 203.049 90.1265 201.611 88.7215 200.872C88.7173 200.833 88.7318 194.753 88.7516 187.684C88.7544 186.688 88.7824 174.398 88.7817 174.247C88.7548 168.717 87.2817 164.353 84.343 160.778C83.9922 160.352 83.4774 160.109 82.9679 160.06Z" fill="url(#RadialGradient)" fill-rule="nonzero" filter="url(#Filter)" stroke="none" vectornator:shadowAngle="1.5708" vectornator:shadowColor="#050505" vectornator:shadowOffset="1" vectornator:shadowOpacity="1" vectornator:shadowRadius="2"/> -</g> -</svg> diff --git a/react-ui/dist/favicon.ico b/react-ui/dist/favicon.ico deleted file mode 100755 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 ZtMWJ#1p_C<F-T5Hu2|;y@Dg%;1puB)gNgtE diff --git a/react-ui/dist/fonts/Inter.ttf b/react-ui/dist/fonts/Inter.ttf deleted file mode 100755 index e72470871b8fc198da424b1e17ed729c202829cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 804612 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%0Ax6j{ZP3#Ka=%E2kFnV}3!H!zffX;7aA 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�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%0A&7R<ezA4~-nJxGL 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 diff --git a/react-ui/dist/index.html b/react-ui/dist/index.html deleted file mode 100755 index caad9f594..000000000 --- a/react-ui/dist/index.html +++ /dev/null @@ -1,22 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8" /> - <link rel="icon" href="favicon.ico" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <meta name="theme-color" content="#000000" /> - <meta - name="description" - content="Web site created using create-react-app" - /> - <link rel="apple-touch-icon" href="logo.png" /> - <link rel="manifest" href="manifest.json" /> - <title>goSDN</title> - <script type="module" crossorigin src="/assets/index-CjxHZxKK.js"></script> - <link rel="stylesheet" crossorigin href="/assets/index-CS1-FuBh.css"> - </head> - <body> - <noscript>You need to enable JavaScript to run this app.</noscript> - <div id="root"></div> - </body> -</html> diff --git a/react-ui/dist/logo.png b/react-ui/dist/logo.png deleted file mode 100755 index ad4ee061e519860d12b8fb8bb044b1df4359f20d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66912 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 diff --git a/react-ui/dist/logo.svg b/react-ui/dist/logo.svg deleted file mode 100755 index b7f71bd90..000000000 --- a/react-ui/dist/logo.svg +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with Vectornator (http://vectornator.io/) --> -<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 113.4 212.625" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:vectornator="http://vectornator.io" xmlns:xlink="http://www.w3.org/1999/xlink"> -<defs> -<radialGradient cx="170.235" cy="146.046" gradientTransform="matrix(1.00001 -8.65109e-05 8.65119e-05 1 -115.465 -116.986)" gradientUnits="userSpaceOnUse" id="RadialGradient" r="217.591"> -<stop offset="0" stop-color="#c456f7"/> -<stop offset="1" stop-color="#34054a"/> -</radialGradient> -<filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="209.692" id="Filter" width="111.957" x="0.722269" y="2.46642"> -<feDropShadow dx="-4.37114e-08" dy="1" flood-color="#050505" flood-opacity="1" in="SourceGraphic" result="Shadow" stdDeviation="1"/> -</filter> -</defs> -<g id="Layer-1" vectornator:layerName="Layer 1"> -<path d="M35.1413 3.47016L35.1416 6.93891L27.1415 6.93961L27.1464 63.3771C21.6096 65.0011 16.4869 67.0445 12.2717 69.6596C-9.35807 83.0789 12.5182 123.232 12.5264 123.222C12.5341 123.213 12.5498 123.2 12.5576 123.191C13.1518 124.609 14.5144 125.761 16.5579 126.534C18.7737 127.372 21.8204 127.855 26.8082 128.408C25.0644 132.318 24.4639 137.732 25.3409 144.846C26.0816 150.854 28.2327 155.309 32.5924 161.533C32.9615 162.06 34.1761 163.796 34.3427 164.033C35.013 164.984 35.5416 165.705 35.9991 166.408C38.1084 169.647 39.1319 172.149 39.3124 174.814C39.3701 175.665 39.3355 180.513 39.251 187.751C39.2362 189.024 39.0999 200.614 39.0959 200.907C37.7122 201.653 36.7523 203.069 36.7525 204.751C36.7527 207.19 38.7205 209.157 41.1591 209.157C43.5978 209.157 45.5653 207.189 45.5651 204.751C45.5649 203.019 44.5477 201.568 43.096 200.844C43.1023 200.341 43.2363 189.045 43.2511 187.782C43.3388 180.268 43.3816 175.583 43.3124 174.563C43.0775 171.096 41.7912 168.012 39.3427 164.251C38.854 163.5 38.3197 162.708 37.6237 161.72C37.4507 161.474 36.2342 159.766 35.8735 159.251C31.8564 153.517 29.9529 149.563 29.3096 144.346C28.2621 135.848 29.4895 130.5 32.027 127.533C32.6413 126.815 33.2789 126.306 33.9019 125.97C34.2334 125.792 34.4442 125.7 34.4956 125.689C35.5735 125.448 36.2365 124.392 35.9954 123.314C35.7543 122.236 34.6982 121.542 33.6202 121.783C33.2264 121.871 32.6655 122.078 31.9953 122.439C31.0669 122.939 30.1635 123.734 29.3079 124.658C23.0392 124.019 20.0922 123.577 17.9951 122.784C16.1482 122.086 15.9773 121.63 16.7137 120.347C25.511 115.923 43.9287 113.157 55.0885 113.156C63.8081 113.155 79.7952 116.873 90.4333 119.622C93.9977 120.542 94.7294 120.755 96.621 121.277C94.2649 123.034 89.4439 124.738 83.3087 125.247C83.0835 125.266 82.9434 125.443 82.7462 125.529C82.6074 125.348 82.5171 125.106 82.3711 124.935C81.4271 123.831 80.3863 122.999 79.3396 122.435C78.6693 122.074 78.1085 121.867 77.7145 121.779C76.6365 121.538 75.5805 122.233 75.3396 123.31C75.0987 124.388 75.7619 125.444 76.8399 125.685C76.8913 125.697 77.1021 125.788 77.4337 125.967C78.0567 126.302 78.6942 126.81 79.3088 127.529C81.8468 130.496 83.0751 135.844 82.029 144.341C81.3867 149.559 79.4839 153.513 75.4678 159.248C75.1071 159.763 73.8909 161.471 73.7179 161.717C73.0221 162.705 72.488 163.498 71.9994 164.248C69.5516 168.009 68.2658 171.094 68.0315 174.561C67.9625 175.581 68.0061 180.266 68.0951 187.78C68.1102 189.055 68.2793 200.673 68.2838 200.967C66.9421 201.725 66.0027 203.098 66.0028 204.749C66.0031 207.187 67.9709 209.155 70.4095 209.155C72.8481 209.154 74.8156 207.187 74.8154 204.748C74.8153 202.975 73.7598 201.482 72.2526 200.779C72.2461 200.277 72.1101 189.009 72.0952 187.748C72.0095 180.511 71.974 175.662 72.0316 174.811C72.2116 172.146 73.2659 169.644 75.3746 166.404C75.8321 165.701 76.3292 164.981 76.9994 164.029C77.1659 163.793 78.3803 162.056 78.7492 161.529C83.1079 155.305 85.2582 150.849 85.9979 144.841C86.8306 138.077 86.2654 132.917 84.7153 129.06C93.073 128.178 99.944 125.471 101.777 121.527C105.258 116.592 120.674 81.4184 100.46 69.1833C96.4145 66.7344 91.6503 64.7196 86.3971 63.1845L86.3922 6.93448L78.3609 6.93517L78.3606 3.46642L35.1413 3.47016ZM31.1419 10.9393L39.1107 10.9386L39.3309 27.9386C39.3406 28.6841 39.9605 29.2606 40.7061 29.2509C41.4516 29.2413 42.0593 28.6214 42.0497 27.8758L41.7983 10.9383L44.517 10.9381L44.7998 27.9381C44.8108 28.6836 45.3981 29.2615 46.1436 29.2505C46.8892 29.2394 47.4983 28.6209 47.4873 27.8753L47.2358 10.9379L49.9546 10.9376L50.2061 27.9376C50.2169 28.6831 50.8357 29.2608 51.5812 29.25C52.3267 29.2392 52.9044 28.6203 52.8936 27.8749L52.6421 10.9374L55.3609 10.9372L55.6124 27.9371C55.623 28.6827 56.242 29.2601 56.9875 29.2495C57.733 29.2389 58.3418 28.6199 58.3312 27.8744L58.0797 10.9369L60.8297 10.9367L61.05 27.9367C61.0546 28.3094 61.2147 28.6381 61.4563 28.8741C61.6979 29.1102 62.0211 29.2537 62.3938 29.2491C63.1394 29.2398 63.7468 28.6194 63.7375 27.8739L63.5173 10.9365L66.2986 10.9362L66.4875 27.905C66.4957 28.6505 67.1171 29.2568 67.8627 29.2486C68.6082 29.2404 69.1834 28.6503 69.1751 27.9047L68.9861 10.936L71.7674 10.9357L71.9564 27.9357C71.9605 28.3085 72.1132 28.6372 72.3627 28.8732C72.6122 29.1091 72.9587 29.2523 73.3315 29.2481C74.077 29.2398 74.6833 28.6498 74.6751 27.9042L74.4862 10.9355L82.3925 10.9348L82.3969 62.2473C78.1953 61.2363 73.8195 60.4151 69.2716 59.936L69.0841 59.936L69.0846 65.9672L62.3352 73.3116L62.211 82.5928L62.212 94.7803L56.5244 94.7808L50.3056 94.7814L50.2733 82.9376L50.1163 73.3126L43.1468 65.8132L43.1463 60.0945L31.1463 62.3455L31.1419 10.9393ZM46.0197 41.188L45.9904 64.3755L52.9599 71.8749L53.1492 91.9374L59.368 91.9368L59.5225 71.8743L66.2407 64.5612L66.2387 41.3425L46.0197 41.188ZM45.5578 121.282C45.0484 121.232 44.5158 121.369 44.0891 121.719C43.2356 122.421 43.1382 123.71 43.8394 124.563C43.8712 124.602 43.9181 124.67 44.0269 124.813C44.2163 125.062 44.4521 125.354 44.6832 125.688C45.3494 126.65 45.998 127.755 46.621 128.938C48.9603 133.379 50.0248 137.836 49.1222 141.875C48.4351 144.95 46.6061 147.711 43.4353 150.126C43.1568 150.338 42.1644 150.942 40.7792 151.751C40.6905 151.803 37.4839 153.662 37.4356 153.689C36.4728 154.23 36.1131 155.445 36.6545 156.408C37.1959 157.37 38.4106 157.699 39.3734 157.157C39.4251 157.128 42.7199 155.272 42.8108 155.22C44.3781 154.304 45.4057 153.669 45.8731 153.313C49.7829 150.336 52.1324 146.76 53.0285 142.75C54.1746 137.622 52.9238 132.266 50.1834 127.063C49.4811 125.729 48.7181 124.526 47.9643 123.438C47.5056 122.775 47.1244 122.271 46.9017 122C46.5511 121.574 46.0673 121.332 45.5578 121.282ZM65.7769 121.28C65.2675 121.33 64.7837 121.572 64.4331 121.999C64.2105 122.27 63.8293 122.774 63.3708 123.436C62.6172 124.525 61.8858 125.728 61.1835 127.062C58.444 132.265 57.163 137.621 58.3099 142.749C59.2067 146.759 61.5569 150.335 65.4671 153.311C65.9346 153.667 66.9935 154.302 68.5611 155.217C68.6519 155.27 71.9158 157.125 71.9675 157.154C72.9304 157.696 74.145 157.367 74.6862 156.404C75.2275 155.441 74.8676 154.227 73.9048 153.686C73.8565 153.658 70.6495 151.8 70.5608 151.748C69.1754 150.939 68.1829 150.336 67.9044 150.124C64.7332 147.71 62.9036 144.948 62.2161 141.874C61.3128 137.835 62.3766 133.378 64.715 128.936C65.3378 127.753 65.9862 126.649 66.6522 125.686C66.8833 125.352 67.1191 125.06 67.3084 124.811C67.4172 124.668 67.4953 124.6 67.5272 124.561C68.2282 123.708 68.0992 122.418 67.2457 121.717C66.8189 121.367 66.2862 121.23 65.7769 121.28ZM28.3735 160.064C27.8641 160.114 27.3492 160.357 26.9985 160.783C24.0604 164.358 22.5881 168.723 22.5621 174.253C22.5614 174.404 22.6311 200.839 22.627 200.877C21.1966 201.608 20.1896 203.036 20.1898 204.753C20.19 207.191 22.1578 209.159 24.5964 209.159C27.0351 209.158 29.0026 207.191 29.0024 204.752C29.0022 203.061 28.0235 201.65 26.627 200.908C26.6562 200.425 26.6538 197.055 26.6259 187.658C26.6229 186.662 26.5615 174.385 26.5622 174.252C26.584 169.618 27.7563 166.157 30.0925 163.314C30.7939 162.461 30.6644 161.203 29.811 160.502C29.3844 160.151 28.8829 160.015 28.3735 160.064ZM82.9679 160.06C82.4585 160.01 81.9571 160.147 81.5304 160.497C80.6772 161.199 80.5479 162.457 81.2494 163.31C83.5862 166.152 84.7591 169.613 84.7817 174.247C84.7823 174.378 84.7241 199.67 84.7527 200.841C83.3011 201.564 82.2529 203.015 82.253 204.747C82.2533 207.186 84.2524 209.153 86.691 209.153C89.1295 209.153 91.0971 207.185 91.0969 204.747C91.0967 203.049 90.1265 201.611 88.7215 200.872C88.7173 200.833 88.7318 194.753 88.7516 187.684C88.7544 186.688 88.7824 174.398 88.7817 174.247C88.7548 168.717 87.2817 164.353 84.343 160.778C83.9922 160.352 83.4774 160.109 82.9679 160.06Z" fill="url(#RadialGradient)" fill-rule="nonzero" filter="url(#Filter)" stroke="none" vectornator:shadowAngle="1.5708" vectornator:shadowColor="#050505" vectornator:shadowOffset="1" vectornator:shadowOpacity="1" vectornator:shadowRadius="2"/> -</g> -</svg> diff --git a/react-ui/dist/manifest.json b/react-ui/dist/manifest.json deleted file mode 100755 index 641e73d58..000000000 --- a/react-ui/dist/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo.png", - "type": "image/png", - "sizes": "400x400" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/react-ui/dist/robots.txt b/react-ui/dist/robots.txt deleted file mode 100755 index e9e57dc4d..000000000 --- a/react-ui/dist/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: -- GitLab From 8e040e6f639733f106c5097aae407bfbb5e45089 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Tue, 10 Dec 2024 16:24:37 +0100 Subject: [PATCH 39/78] ui: apply gofmt to networkelement --- controller/northbound/server/networkElement.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go index 10312d0f9..08bcf2a0e 100644 --- a/controller/northbound/server/networkElement.go +++ b/controller/northbound/server/networkElement.go @@ -20,10 +20,10 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" - "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" util "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/gnmi" "code.fbi.h-da.de/danet/gosdn/controller/store" aGNMI "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" + "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "github.com/bufbuild/protovalidate-go" "github.com/google/uuid" "github.com/hashicorp/go-multierror" @@ -187,7 +187,7 @@ func (n *NetworkElementServer) ParseYang(ctx context.Context, request *mnepb.Par if err := n.protoValidator.Validate(request); err != nil { return nil, status.Errorf(codes.Aborted, "%v", err) } - + device := &openconfig.Device{} if err := openconfig.Unmarshal([]byte(request.Yang), device); err != nil { @@ -210,7 +210,7 @@ func (n *NetworkElementServer) ParseYang(ctx context.Context, request *mnepb.Par return &mnepb.ParseYangResponse{ Timestamp: time.Now().UnixNano(), - Json: string(json), + Json: string(json), }, nil } -- GitLab From 2e301902316e151f37e3efafc9487cf5482766d9 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 11 Dec 2024 00:00:08 +0100 Subject: [PATCH 40/78] ui: add global menu item --- react-ui/README.md | 2 - react-ui/docker/wasm/Dockerfile | 13 -- react-ui/docker/wasm/entrypoint.sh | 9 - react-ui/package.json | 7 +- react-ui/scripts/build-wasm.sh | 38 ---- .../devices/routines/mne.routine.ts | 7 +- .../devices/view/device.view.tabs.tsx | 2 +- .../components/login/layouts/login.layout.tsx | 2 +- .../src/i18n/locales/en/translations.json | 3 + react-ui/src/index.tsx | 23 +-- .../reducer/json_viewer.reducer.ts | 1 - react-ui/src/shared/error/Error.ts | 1 + react-ui/src/shared/error/FetchError.ts | 5 + react-ui/src/shared/helper/interfaces.ts | 5 + react-ui/src/shared/layouts/basic.layout.tsx | 2 - .../protected.layout/protected.layout.scss | 2 +- .../protected.layout/protected.layout.tsx | 17 +- .../src/shared/provider/auth.provider.tsx | 16 +- .../shared/provider/menu/menu.provider.tsx | 37 +++- .../src/shared/provider/utils.provider.tsx | 5 +- .../shared/utils/yang_parser/go/.gitignore | 1 - .../go/assets/wasm_exec.d.ts.generated | 18 -- .../src/shared/utils/yang_parser/go/go.env | 1 - .../src/shared/utils/yang_parser/go/go.mod | 18 -- .../src/shared/utils/yang_parser/go/go.sum | 171 ------------------ .../utils/yang_parser/go/yang_parser.go | 39 ---- .../shared/utils/yang_parser/yang_parser.ts | 38 ---- react-ui/tsconfig.json | 1 - react-ui/vite.config.mjs | 5 +- react-ui/yarn.lock | 112 +----------- 30 files changed, 93 insertions(+), 508 deletions(-) delete mode 100755 react-ui/docker/wasm/Dockerfile delete mode 100755 react-ui/docker/wasm/entrypoint.sh delete mode 100755 react-ui/scripts/build-wasm.sh create mode 100644 react-ui/src/shared/error/Error.ts create mode 100644 react-ui/src/shared/error/FetchError.ts create mode 100644 react-ui/src/shared/helper/interfaces.ts delete mode 100755 react-ui/src/shared/utils/yang_parser/go/.gitignore delete mode 100755 react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated delete mode 100755 react-ui/src/shared/utils/yang_parser/go/go.env delete mode 100755 react-ui/src/shared/utils/yang_parser/go/go.mod delete mode 100755 react-ui/src/shared/utils/yang_parser/go/go.sum delete mode 100755 react-ui/src/shared/utils/yang_parser/go/yang_parser.go delete mode 100755 react-ui/src/shared/utils/yang_parser/yang_parser.ts diff --git a/react-ui/README.md b/react-ui/README.md index c9208ec09..b6c8b0ba1 100755 --- a/react-ui/README.md +++ b/react-ui/README.md @@ -7,7 +7,5 @@ This is the UI for the goSDN project. It's a webapp written in react ### Requirements - Docker - - ### Author Matthias Feyll \ No newline at end of file diff --git a/react-ui/docker/wasm/Dockerfile b/react-ui/docker/wasm/Dockerfile deleted file mode 100755 index 343521154..000000000 --- a/react-ui/docker/wasm/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM golang:alpine3.20 - -WORKDIR /app - -ARG USER -ARG GROUP - -RUN mkdir /.cache && chmod -R 777 /.cache - -COPY ./docker/wasm/entrypoint.sh / - - -ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/react-ui/docker/wasm/entrypoint.sh b/react-ui/docker/wasm/entrypoint.sh deleted file mode 100755 index 934d25928..000000000 --- a/react-ui/docker/wasm/entrypoint.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env sh - -#go mod download && go mod verify -#ls -al $(go env GOROOT)/lib/ - -GOOS=js GOARCH=wasm "$@" - -cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" ./build/wasm -cp "./src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated" ./build/wasm/wasm_exec.d.ts diff --git a/react-ui/package.json b/react-ui/package.json index 951b1c216..22017e594 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -16,6 +16,7 @@ "react": "^18.3.1", "react-bootstrap": "^2.10.2", "react-dom": "^18.3.1", + "react-error-boundary": "^4.1.2", "react-i18next": "^15.0.0", "react-json-view": "^1.21.3", "react-redux": "^9.1.2", @@ -32,8 +33,6 @@ "build": "tsc && vite build", "test": "react-scripts test", "build::api": "npx @rtk-query/codegen-openapi ./scripts/openapi-config.json", - "build::wasm": "./scripts/build-wasm.sh", - "build::cpp": "./scripts/build-cpp.sh", "lint": "eslint src", "lint::fix": "eslint src --fix", "clean": "./scripts/clean.sh" @@ -84,8 +83,6 @@ "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", "vite": "^5.4.9", - "vite-bundle-visualizer": "^1.2.1", - "vite-plugin-top-level-await": "^1.4.4", - "vite-plugin-wasm": "^3.3.0" + "vite-bundle-visualizer": "^1.2.1" } } diff --git a/react-ui/scripts/build-wasm.sh b/react-ui/scripts/build-wasm.sh deleted file mode 100755 index 3b4ab1ab5..000000000 --- a/react-ui/scripts/build-wasm.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env sh - -GO_FILE=src/shared/utils/yang_parser/go -YANG_MODEL_PATH=$GO_FILE/openconfig - -OUTPUT_PATH=/build/wasm - -if [ ! -d $OUTPUT_PATH ]; then - mkdir -p $(pwd)/$OUTPUT_PATH -fi - -if [ ! -d $YANG_MODEL_PATH ]; then - mkdir $YANG_MODEL_PATH -fi - -rm $YANG_MODEL_PATH/yang_models.go -ln $(pwd)/../models/generated/openconfig/yang.go $YANG_MODEL_PATH/yang_models.go -echo 'Succesfully linked yang model' - -DOCKER_TAG=gosdn_react_ui_wasm -docker build \ - --no-cache \ - -t $DOCKER_TAG \ - -f ./docker/wasm/Dockerfile \ - --build-arg USER=$(id -u) \ - --build-arg GROUP=$(id -g) \ - . -DOCKER_PATH=/app -OUTPUT_FILE=$DOCKER_PATH$OUTPUT_PATH/ - -docker run \ - --rm \ - -v $(pwd):$DOCKER_PATH \ - -u $(id -u):$(id -g) \ - -w $DOCKER_PATH \ - $DOCKER_TAG \ - go build -C $GO_FILE -ldflags="-s -w" -o $OUTPUT_FILE/yang_parser.wasm - diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts index 378e6e8cf..7de1d1814 100755 --- a/react-ui/src/components/devices/routines/mne.routine.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -32,8 +32,13 @@ export const fetchSelectedMneThunk = createAsyncThunk( async (device: Device, thunkApi) => { const { user } = thunkApi.getState() as RootState + if (!user.user?.roles || !device.id) { + throw new Error('Background MNE fetching failed! User data is missing. Reload page or logout and login again') + // TODO + } + const payload: NetworkElementServiceGetApiArg = { - pid: Object.keys(user?.user.roles)[0], + pid: Object.keys(user.user.roles)[0], timestamp: new Date().getTime().toString(), mneid: device.id, } diff --git a/react-ui/src/components/devices/view/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx index d492c90b7..2929f9b64 100755 --- a/react-ui/src/components/devices/view/device.view.tabs.tsx +++ b/react-ui/src/components/devices/view/device.view.tabs.tsx @@ -14,7 +14,7 @@ export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { const metadataTab = () => { return ( <div> - {selectedDevice.mne.name} + {selectedDevice!.mne!.name} </div> ) } diff --git a/react-ui/src/components/login/layouts/login.layout.tsx b/react-ui/src/components/login/layouts/login.layout.tsx index 323941a67..556dc6de4 100755 --- a/react-ui/src/components/login/layouts/login.layout.tsx +++ b/react-ui/src/components/login/layouts/login.layout.tsx @@ -4,7 +4,7 @@ import { useNavigate, useOutlet } from "react-router-dom"; import LoginView from "../view/login.view"; -export const LoginLayout = ({ children }) => { +export const LoginLayout = () => { const outlet = useOutlet(); const navigate = useNavigate(); const { isAuthenticated } = useAuth(); diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index c5e037548..46b76563c 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -7,6 +7,9 @@ }, "toast": { "copied": "Copied to clipboard" + }, + "menu_item": { + "logout": "Logout" } }, "json_viewer": { diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 186138b89..8383248ce 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,8 +1,8 @@ -import { MenuProvider } from '@provider/menu/menu.provider' import { UtilsProvider } from '@provider/utils.provider' import i18next from 'i18next' import React from 'react' import ReactDOM from 'react-dom/client' +import { ErrorBoundary } from "react-error-boundary" import { I18nextProvider } from 'react-i18next' import { Provider } from 'react-redux' import { @@ -16,20 +16,21 @@ import { router } from './routes' import './shared/icons/icons' import { persistor, store } from './stores' + ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> - <Provider store={store}> - <PersistGate loading={null} persistor={persistor}> - <I18nextProvider i18n={i18next}> - <UtilsProvider> - <MenuProvider> + <ErrorBoundary fallback={<div>Something went wrong</div>}> + <Provider store={store}> + <PersistGate loading={null} persistor={persistor}> + <I18nextProvider i18n={i18next}> + <UtilsProvider> <ToastContainer /> <RouterProvider router={router} /> - </MenuProvider> - </UtilsProvider> - </I18nextProvider> - </PersistGate> - </Provider> + </UtilsProvider> + </I18nextProvider> + </PersistGate> + </Provider> + </ErrorBoundary> </React.StrictMode> ); diff --git a/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts index cdd0351b1..0779d0e18 100755 --- a/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts +++ b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts @@ -59,7 +59,6 @@ const JsonViewerSlice = createSlice({ if (i === -1) { - console.log('new ' + payload.key + " => " + payload.nested + ' end') // create new collapse const newItem = { identifier, collapsed: true } state.collapseContainer = [...state.collapseContainer, newItem] diff --git a/react-ui/src/shared/error/Error.ts b/react-ui/src/shared/error/Error.ts new file mode 100644 index 000000000..b4c878601 --- /dev/null +++ b/react-ui/src/shared/error/Error.ts @@ -0,0 +1 @@ +export type BasicError = Error; \ No newline at end of file diff --git a/react-ui/src/shared/error/FetchError.ts b/react-ui/src/shared/error/FetchError.ts new file mode 100644 index 000000000..a1655e19d --- /dev/null +++ b/react-ui/src/shared/error/FetchError.ts @@ -0,0 +1,5 @@ +import { BasicError } from "./Error"; + +export interface FetchError extends BasicError { + action: string +} \ No newline at end of file diff --git a/react-ui/src/shared/helper/interfaces.ts b/react-ui/src/shared/helper/interfaces.ts new file mode 100644 index 000000000..97a822706 --- /dev/null +++ b/react-ui/src/shared/helper/interfaces.ts @@ -0,0 +1,5 @@ +import React from "react"; + +export interface BasicProp { + children: React.ReactNode +} \ No newline at end of file diff --git a/react-ui/src/shared/layouts/basic.layout.tsx b/react-ui/src/shared/layouts/basic.layout.tsx index 640af3e1b..e3728ac6d 100755 --- a/react-ui/src/shared/layouts/basic.layout.tsx +++ b/react-ui/src/shared/layouts/basic.layout.tsx @@ -4,8 +4,6 @@ import { useOutlet } from "react-router-dom"; export const BasicLayout = () => { const outlet = useOutlet(); - - return ( <AuthProvider> {outlet} diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss index ffc4acf0d..07b38d5a7 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss @@ -1,4 +1,4 @@ -@import '/src/shared/style/colors.scss'; +@import "/src/shared/style/colors.scss"; $sidebar-width: 4.5em; diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 03a188796..0708d87f1 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -4,6 +4,7 @@ import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-ic import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useAppDispatch, useAppSelector } from '@hooks'; import { useAuth } from "@provider/auth.provider"; +import { MenuProvider } from '@provider/menu/menu.provider'; import { DEVICE_URL, LOGIN_URL } from '@routes'; import { fetchUser } from '@shared/reducer/user.reducer'; import React, { useEffect } from "react"; @@ -71,7 +72,7 @@ export const ProtectedLayout = () => { const VerticalSidebar = () => { return ( - <div className="d-flex fixed-top z-n1 flex-column flex-shrink-0 bg-white sidebar justify-content-end border-end border-dark py-3"> + <div className="d-flex fixed-top flex-column flex-shrink-0 bg-white sidebar justify-content-end border-end border-dark py-3 z-2"> <FontAwesomeIcon className="clickable icon" icon={faRightFromBracket} onClick={logout} size="2x" /> </div> ) @@ -79,7 +80,7 @@ export const ProtectedLayout = () => { const HorizontalNavbar = () => { return ( - <nav className="bg-white border-bottom border-dark py-2 d-flex align-items-center"> + <nav className="bg-white border-bottom border-dark py-2 d-flex align-items-center z-3 position-relative"> <Link to="/"><img src={logo} className="mx-4 me-5" width={25} alt="logo" /></Link> <Link className={"head-links" + handleActiveLink(DEVICE_URL)} to="/">{t('protected.link.device_list')}</Link> <Link className={"head-links" + handleActiveLink('/map')} to="/">{t('protected.link.map')}</Link> @@ -104,11 +105,13 @@ export const ProtectedLayout = () => { return ( <div> - {HorizontalNavbar()} - {VerticalSidebar()} - <div className='main-content'> - <Outlet /> - </div> + <MenuProvider> + {HorizontalNavbar()} + {VerticalSidebar()} + <div className='main-content'> + <Outlet /> + </div> + </MenuProvider> </div> ) }; \ No newline at end of file diff --git a/react-ui/src/shared/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx index faf29847f..830a4d47d 100755 --- a/react-ui/src/shared/provider/auth.provider.tsx +++ b/react-ui/src/shared/provider/auth.provider.tsx @@ -1,5 +1,6 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; import { getCookieValue } from "@helper/coookie"; +import { BasicProp } from "@helper/interfaces"; import { useAppDispatch, useAppSelector } from "@hooks"; import { DEVICE_URL, LOGIN_URL } from "@routes"; import { jwtDecode } from "jwt-decode"; @@ -11,14 +12,7 @@ interface AuthProviderType { login: (username: string, password: string) => void, logout: () => void, // todo figure out the type of loginProperties - loginProperties: { - isLoading: boolean, - isSuccess: boolean, - isError: boolean, - error: object, - data: object, - reset: () => void - } | undefined, + loginProperties: any, isAuthenticated: () => boolean } @@ -29,7 +23,7 @@ const AuthContext = createContext<AuthProviderType>({ isAuthenticated: () => { throw new Error("login function not implemented"); }, }); -export const AuthProvider = ({ children }) => { +export const AuthProvider: React.FC<BasicProp> = ({ children }) => { const dispatch = useAppDispatch() const navigate = useNavigate() const { username } = useAppSelector(state => state.user) @@ -75,7 +69,7 @@ export const AuthProvider = ({ children }) => { dispatch(setToken({ token: response.token, username })); navigate(DEVICE_URL); - }).catch((error) => { + }).catch(() => { // determine whether 500 or 401 err }); } @@ -102,7 +96,7 @@ export const AuthProvider = ({ children }) => { // TODO: purge other information } - const value = useMemo( + const value = useMemo<AuthProviderType>( () => ({ login: executeLogin, logout, diff --git a/react-ui/src/shared/provider/menu/menu.provider.tsx b/react-ui/src/shared/provider/menu/menu.provider.tsx index 3d3aebc4a..0cfc61f68 100644 --- a/react-ui/src/shared/provider/menu/menu.provider.tsx +++ b/react-ui/src/shared/provider/menu/menu.provider.tsx @@ -1,6 +1,9 @@ -import { IconDefinition } from "@fortawesome/free-solid-svg-icons"; +import { faRightFromBracket, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { BasicProp } from "@helper/interfaces"; +import { useAuth } from "@provider/auth.provider"; import React, { createContext, useContext, useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; import './menu.provider.scss'; interface MenuSubscription { @@ -31,21 +34,38 @@ interface SubscriptionValue { } -export const MenuProvider = ({ children }) => { +export const MenuProvider: React.FC<BasicProp> = ({ children }) => { const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 }); const [showMenu, setShowMenu] = useState(false); const [subscribedTargets, setSubscribedTargets] = useState<Array<SubscriptionValue>>([]) + const { logout } = useAuth() - const [menuItems, setMenuItems] = useState<Array<SubscriptionValue>>([]); + const { t } = useTranslation('common') + + const globalMenuItems: SubscriptionValue = { + actions: [{ + key: t('global.menu_item.logout'), + icon: faRightFromBracket, + action: logout + }], + target: document.getRootNode() as HTMLElement + } + + const [menuItems, _setMenuItems] = useState<Array<SubscriptionValue>>([]); const [clickedHtmlElement, setClickedHtmlElement] = useState<HTMLElement>() - const handleContextMenu = (event) => { + + const setMenuItems = (menuItems: Array<SubscriptionValue>) => { + _setMenuItems([...menuItems, globalMenuItems]) + } + + const handleContextMenu = (event: React.MouseEvent<HTMLElement>) => { event.preventDefault(); - const targets = subscribedTargets.filter(({ target }) => target.contains(event.target)) + const targets = subscribedTargets.filter(({ target }) => target.contains(event.target as HTMLElement)) setMenuPosition({ top: event.pageY, left: event.pageX }); setMenuItems(targets) - setClickedHtmlElement(event.target) + setClickedHtmlElement(event.target as HTMLElement) displayMenu() }; @@ -95,11 +115,12 @@ export const MenuProvider = ({ children }) => { { menuItems.map((item, i) => { // for each new action array (for each new subscription entity) draw a seperator line except the last action - const seperator = i < menuItems.length - 1 ? (<li><hr className="dropdown-divider"></hr></li>) : (<React.Fragment key={i}></React.Fragment>) + const deviderHTML = (<li key={i}><hr className="dropdown-divider"></hr></li>); + const seperator = i < menuItems.length - 1 ? deviderHTML : (<React.Fragment key={i}></React.Fragment>) const dropdownItems = item.actions.map(({ action, icon, key }) => { - const disabled = !(clickedHtmlElement instanceof HTMLElement) || !clickedHtmlElement?.textContent + const disabled = !(clickedHtmlElement instanceof HTMLElement) return ( <button className="menu-button dropdown-item" key={key + " " + i} disabled={disabled} onClick={() => action(clickedHtmlElement)}> diff --git a/react-ui/src/shared/provider/utils.provider.tsx b/react-ui/src/shared/provider/utils.provider.tsx index e9a83034e..6f6775343 100644 --- a/react-ui/src/shared/provider/utils.provider.tsx +++ b/react-ui/src/shared/provider/utils.provider.tsx @@ -1,4 +1,5 @@ -import { createContext, useContext, useMemo } from "react"; +import { BasicProp } from "@helper/interfaces"; +import React, { createContext, useContext, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "react-toastify"; @@ -12,7 +13,7 @@ const UtilsContext = createContext<UtilsProviderType>({ } }) -export const UtilsProvider = ({ children }) => { +export const UtilsProvider: React.FC<BasicProp> = ({ children }) => { const { t } = useTranslation('common'); const value = useMemo<UtilsProviderType>(() => { diff --git a/react-ui/src/shared/utils/yang_parser/go/.gitignore b/react-ui/src/shared/utils/yang_parser/go/.gitignore deleted file mode 100755 index 4be9e9e37..000000000 --- a/react-ui/src/shared/utils/yang_parser/go/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/openconfig \ No newline at end of file diff --git a/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated b/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated deleted file mode 100755 index ab9e80009..000000000 --- a/react-ui/src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated +++ /dev/null @@ -1,18 +0,0 @@ -declare namespace globalThis { - let fs: FileSystem - let process: Process - let crypto: Crypto - let TextEncoder: { new (encoding: string): TextEncoder } - let TextDecoder: { new (encoding: string): TextDecoder } - let Go: typeof Go -} - -interface Go { - argv: string[] - env: { [envKey: string]: string } - exit: (code: number) => void - importObject: WebAssembly.Imports - exited: boolean - mem: DataView - run(instance: WebAssembly.Instance): Promise<void> -} diff --git a/react-ui/src/shared/utils/yang_parser/go/go.env b/react-ui/src/shared/utils/yang_parser/go/go.env deleted file mode 100755 index 6a9eb46ee..000000000 --- a/react-ui/src/shared/utils/yang_parser/go/go.env +++ /dev/null @@ -1 +0,0 @@ -GOPROXY="direct" \ No newline at end of file diff --git a/react-ui/src/shared/utils/yang_parser/go/go.mod b/react-ui/src/shared/utils/yang_parser/go/go.mod deleted file mode 100755 index cd6a54898..000000000 --- a/react-ui/src/shared/utils/yang_parser/go/go.mod +++ /dev/null @@ -1,18 +0,0 @@ -module yang_parser - -go 1.21.0 - -require ( - github.com/golang/glog v1.2.2 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/openconfig/gnmi v0.11.0 // indirect - github.com/openconfig/goyang v1.6.0 // indirect - github.com/openconfig/ygot v0.29.20 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/text v0.17.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/protobuf v1.35.1 // indirect -) diff --git a/react-ui/src/shared/utils/yang_parser/go/go.sum b/react-ui/src/shared/utils/yang_parser/go/go.sum deleted file mode 100755 index fe012ebb7..000000000 --- a/react-ui/src/shared/utils/yang_parser/go/go.sum +++ /dev/null @@ -1,171 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/openconfig/gnmi v0.10.0/go.mod h1:Y9os75GmSkhHw2wX8sMsxfI7qRGAEcDh8NTa5a8vj6E= -github.com/openconfig/gnmi v0.11.0 h1:H7pLIb/o3xObu3+x0Fv9DCK7TH3FUh7mNwbYe+34hFw= -github.com/openconfig/gnmi v0.11.0/go.mod h1:9oJSQPPCpNvfMRj8e4ZoLVAw4wL8HyxXbiDlyuexCGU= -github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU= -github.com/openconfig/goyang v1.6.0 h1:JjnPbLY1/y28VyTO67LsEV0TaLWNiZyDcsppGq4F4is= -github.com/openconfig/goyang v1.6.0/go.mod h1:sdNZi/wdTZyLNBNfgLzmmbi7kISm7FskMDKKzMY+x1M= -github.com/openconfig/grpctunnel v0.0.0-20220819142823-6f5422b8ca70/go.mod h1:OmTWe7RyZj2CIzIgy4ovEBzCLBJzRvWSZmn7u02U9gU= -github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs= -github.com/openconfig/ygot v0.29.20 h1:XHLpwCN91QuKc2LAvnEqtCmH8OuxgLlErDhrdl2mJw8= -github.com/openconfig/ygot v0.29.20/go.mod h1:K8HbrPm/v8/emtGQ9+RsJXx6UPKC5JzS/FqK7pN+tMo= -github.com/pborman/getopt v1.1.0/go.mod h1:FxXoW1Re00sQG/+KIkuSqRL/LwQgSkv7uyac+STFsbk= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/protocolbuffers/txtpbfmt v0.0.0-20220608084003-fc78c767cd6a/go.mod h1:KjY0wibdYKc4DYkerHSbguaf3JeIPGhNJBp2BNiFH78= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20210811021853-ddbe55d93216/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/react-ui/src/shared/utils/yang_parser/go/yang_parser.go b/react-ui/src/shared/utils/yang_parser/go/yang_parser.go deleted file mode 100755 index 4314d0eb1..000000000 --- a/react-ui/src/shared/utils/yang_parser/go/yang_parser.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -import ( - "fmt" - "syscall/js" - "yang_parser/openconfig" - - "github.com/openconfig/ygot/ygot" -) - -func ParseYANGFile(this js.Value, p []js.Value) interface{} { - device := &openconfig.Device{} - - yangContent := p[0].String() - - if err := openconfig.Unmarshal([]byte(yangContent), device); err != nil { - panic(fmt.Sprintf("Cannot unmarshal JSON: %v", err)) - } - - json, err := ygot.EmitJSON(device, &ygot.EmitJSONConfig{ - Format: ygot.RFC7951, - Indent: " ", - RFC7951Config: &ygot.RFC7951JSONConfig{ - AppendModuleName: true, - }, - }) - - if err != nil { - panic(fmt.Sprintf("Cannot emit json: %v ", err)) - } - - return js.ValueOf(string(json)) -} - -func main() { - js.Global().Set("parseYANG", js.FuncOf(ParseYANGFile)) - - select {} -} diff --git a/react-ui/src/shared/utils/yang_parser/yang_parser.ts b/react-ui/src/shared/utils/yang_parser/yang_parser.ts deleted file mode 100755 index d6ca3201c..000000000 --- a/react-ui/src/shared/utils/yang_parser/yang_parser.ts +++ /dev/null @@ -1,38 +0,0 @@ -import '@build/wasm/wasm_exec.js' - -import { useEffect, useRef } from 'react' - -export const useYangParser = () => { - const wasm = useRef<Promise<ArrayBuffer>>() - const go = useRef(new Go()) - - useEffect(() => { - wasm.current = fetch('/build/wasm/yang_parser.wasm') - .then((response) => response.arrayBuffer()) - .then((bytes) => bytes) - }, []) - - /** - * Parses yang model that the backend responses to a JSON object - * - * @param uniformYang - * @returns - */ - const parse = async (modifiedYang: string): Promise<JSON> => { - try { - const bytes = await wasm.current - const { instance } = await WebAssembly.instantiate(bytes!, go.current.importObject) - go.current.run(instance) - - const jsonString = parseYANG(modifiedYang) - return JSON.parse(jsonString) - } catch (err) { - console.log('Error' + err) - return Promise.reject(err) - } - } - - return { - parse, - } -} diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index 10cd20012..c679b7100 100755 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -45,5 +45,4 @@ "scripts/test.ts", "src/shared/utils/yang_parser/go/assets/wasm_exec.d.ts.generated" ] - //"references": [{ "path": "./tsconfig.node.json" }] } diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 3bf58a286..fefafe05a 100755 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -1,13 +1,12 @@ import react from '@vitejs/plugin-react' import { defineConfig } from 'vite' -import topLevelAwait from 'vite-plugin-top-level-await' -import wasm from 'vite-plugin-wasm' export default defineConfig({ - plugins: [react(), wasm(), topLevelAwait()], + plugins: [react()], build: { sourcemap: true, }, + // develop server server: { port: 3000, proxy: { diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index d60413ed6..c8a068d68 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -2009,11 +2009,6 @@ "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" -"@rollup/plugin-virtual@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz#17e17eeecb4c9fa1c0a6e72c9e5f66382fddbb82" - integrity sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A== - "@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" @@ -2253,80 +2248,6 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" -"@swc/core-darwin-arm64@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.36.tgz#f50ecd4db72a8759c67c1eb93f942c6331e6cfe9" - integrity sha512-8vDczXzCgv3ceTPhEivlpGprN44YlrCK1nbfU9g2TrhV/Aiqi09W/eM5zLesdoM1Z3mJl492gc/8nlTkpDdusw== - -"@swc/core-darwin-x64@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.7.36.tgz#14c7e5c0a9bee4ffcf05a5a62caa179ee01a68c2" - integrity sha512-Pa2Gao7+Wf5m3SsK4abKRtd48AtoUnJInvaC3d077swBfgZjbjUbQvcpdc2dOeQtWwo49rFqUZJonMsL0jnPgQ== - -"@swc/core-linux-arm-gnueabihf@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.36.tgz#19d9a66606ae9fc09f3e087a1ef49d75ffd769e7" - integrity sha512-3YsMWd7V+WZEjbfBnLkkz/olcRBa8nyoK0iIOnNARJBMcYaJxjkJSMZpmSojCnIVwvjA1N83CPAbUL+W+fCnHg== - -"@swc/core-linux-arm64-gnu@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.36.tgz#9834e507e75d1689913fc56d401d5921eb75be67" - integrity sha512-lqM3aBB7kJazJYOwHeA5OGNLqXoQPZ/76b3dV+XcjN1GhD0CcXz6mW5PRYVin6OSN1eKrKBKJjtDA1mqADDEvw== - -"@swc/core-linux-arm64-musl@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.36.tgz#548abbec7581f06ab9f38bd6c289bd7fc9983452" - integrity sha512-bqei2YDzvUfG0pth5W2xJaj0eG4XWYk0d/NJ75vBX6bkIzK6dC8iuKQ41jOfUWonnrAs7rTDDJW0sTn/evvRdw== - -"@swc/core-linux-x64-gnu@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.36.tgz#d2a4a8edcdb3b7646dade9783d6502d01ff9364c" - integrity sha512-03maXTUyaBjeCxlDltmdzHje1ryQt1C4OWmmNgSSRXjLb+GNnAenwOJMSrcvHP/aNClD2pwsFCnYKDGy+sYE6w== - -"@swc/core-linux-x64-musl@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.36.tgz#ea4197cbcc23b1202cdbec82a05bee9b29aa341b" - integrity sha512-XXysqLkvjtQnXm1zHqLhy00UYPv/gk5OtwR732X+piNisnEbcJBqI8Qp9O7YvLWllRcoP8IMBGDWLGdGLSpViA== - -"@swc/core-win32-arm64-msvc@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.36.tgz#1b100b809457d0ed5710956d7efb4fd0427dc2c8" - integrity sha512-k7+dmb13a/zPw+E4XYfPmLZFWJgcOcBRKIjYl9nQErtYsgsg3Ji6TBbsvJVETy23lNHyewZ17V5Vq6NzaG0hzg== - -"@swc/core-win32-ia32-msvc@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.36.tgz#577e7f25a7a8496c16e9b14486cd849765bccba5" - integrity sha512-ridD3ay6YM2PEYHZXXFN+edYEv0FOynaqOBP+NSnGNHA35azItIjoIe+KNi4WltGtAjpKCHSpjGCNfna12wdYQ== - -"@swc/core-win32-x64-msvc@1.7.36": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.36.tgz#f85ace043925a746ff40af2da1ff9ff9760525bb" - integrity sha512-j1z2Z1Ln9d0E3dHsPkC1K9XDh0ojhRPwV+GfRTu4D61PE+aYhYLvbJC6xPvL4/204QrStRS7eDu3m+BcDp3rgQ== - -"@swc/core@^1.7.0": - version "1.7.36" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.36.tgz#369b67cfe7be039dac2ab2180b44da8f2f8c2af0" - integrity sha512-bu7ymMX+LCJOSSrKank25Jaq66ymLVA9fOUuy4ck3/6rbXdLw+pIJPnIDKQ9uNcxww8KDxOuJk9Ui9pqR+aGFw== - dependencies: - "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.13" - optionalDependencies: - "@swc/core-darwin-arm64" "1.7.36" - "@swc/core-darwin-x64" "1.7.36" - "@swc/core-linux-arm-gnueabihf" "1.7.36" - "@swc/core-linux-arm64-gnu" "1.7.36" - "@swc/core-linux-arm64-musl" "1.7.36" - "@swc/core-linux-x64-gnu" "1.7.36" - "@swc/core-linux-x64-musl" "1.7.36" - "@swc/core-win32-arm64-msvc" "1.7.36" - "@swc/core-win32-ia32-msvc" "1.7.36" - "@swc/core-win32-x64-msvc" "1.7.36" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - "@swc/helpers@^0.5.0": version "0.5.12" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" @@ -2334,13 +2255,6 @@ dependencies: tslib "^2.4.0" -"@swc/types@^0.1.13": - version "0.1.13" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.13.tgz#441734f8bfa6e9e738f1c68e98be6da282ecc7db" - integrity sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q== - dependencies: - "@swc/counter" "^0.1.3" - "@testing-library/jest-dom@^6.4.8": version "6.4.8" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz#9c435742b20c6183d4e7034f2b329d562c079daa" @@ -8993,6 +8907,13 @@ react-dom@^18.3.1: loose-envify "^1.1.0" scheduler "^0.23.2" +react-error-boundary@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.1.2.tgz#bc750ad962edb8b135d6ae922c046051eb58f289" + integrity sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag== + dependencies: + "@babel/runtime" "^7.12.5" + react-error-overlay@^6.0.11: version "6.0.11" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" @@ -10882,11 +10803,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -10921,20 +10837,6 @@ vite-bundle-visualizer@^1.2.1: rollup-plugin-visualizer "^5.11.0" tmp "^0.2.1" -vite-plugin-top-level-await@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.4.tgz#4900e06bfb7179de20aaa9b4730d04022a9e259e" - integrity sha512-QyxQbvcMkgt+kDb12m2P8Ed35Sp6nXP+l8ptGrnHV9zgYDUpraO0CPdlqLSeBqvY2DToR52nutDG7mIHuysdiw== - dependencies: - "@rollup/plugin-virtual" "^3.0.2" - "@swc/core" "^1.7.0" - uuid "^10.0.0" - -vite-plugin-wasm@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/vite-plugin-wasm/-/vite-plugin-wasm-3.3.0.tgz#2908ef2529bf8f33f4e549c8c6fda26ad273ca15" - integrity sha512-tVhz6w+W9MVsOCHzxo6SSMSswCeIw4HTrXEi6qL3IRzATl83jl09JVO1djBqPSwfjgnpVHNLYcaMbaDX5WB/pg== - vite@^5.4.9: version "5.4.9" resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.9.tgz#215c80cbebfd09ccbb9ceb8c0621391c9abdc19c" -- GitLab From 8730000e502ffef05abf517c6e065190985f1b53 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 11 Dec 2024 00:19:55 +0100 Subject: [PATCH 41/78] update packages --- react-ui/package.json | 9 +- react-ui/yarn.lock | 4689 ++++++++++++++++++++--------------------- 2 files changed, 2260 insertions(+), 2438 deletions(-) diff --git a/react-ui/package.json b/react-ui/package.json index 22017e594..466870928 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -11,14 +11,13 @@ "@reduxjs/toolkit": "^2.2.4", "bootstrap": "^5.3.3", "dompurify": "^3.2.3", - "i18next": "^23.11.5", + "i18next": "^24.0.5", "jwt-decode": "^4.0.0", "react": "^18.3.1", "react-bootstrap": "^2.10.2", "react-dom": "^18.3.1", "react-error-boundary": "^4.1.2", "react-i18next": "^15.0.0", - "react-json-view": "^1.21.3", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", "react-scripts": "5.0.1", @@ -58,7 +57,7 @@ "proxy": "http://localhost:55055", "devDependencies": { "@babel/runtime": "^7.21.5", - "@rtk-query/codegen-openapi": "^1.2.0", + "@rtk-query/codegen-openapi": "^2.0.0", "@testing-library/jest-dom": "^6.4.8", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", @@ -78,11 +77,11 @@ "eslint-plugin-react-refresh": "^0.4.9", "globals": "^15.9.0", "prettier": "^3.3.3", - "sass": "1.77.6", + "sass": "1.82.0", "sass-embedded": "^1.80.6", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^5.4.9", + "vite": "^6.0.3", "vite-bundle-visualizer": "^1.2.1" } } diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index c8a068d68..d054db6d6 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -3,9 +3,9 @@ "@adobe/css-tools@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" - integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.1.tgz#2447a230bfe072c1659e6815129c03cf170710e3" + integrity sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -61,34 +61,35 @@ ajv-draft-04 "^1.0.0" call-me-maybe "^1.0.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.8.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.8.3": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.24.7" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" - integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== -"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.24.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" - integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.26.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-module-transforms" "^7.25.2" - "@babel/helpers" "^7.25.0" - "@babel/parser" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.2" - "@babel/types" "^7.25.2" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -96,76 +97,69 @@ semver "^6.3.1" "@babel/eslint-parser@^7.16.3": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" - integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c" + integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.25.0", "@babel/generator@^7.7.2": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" - integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== +"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/types" "^7.25.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" - integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== - dependencies: - "@babel/types" "^7.24.7" + jsesc "^3.0.2" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" - integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" - integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.25.2" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz#a109bf9c3d58dfed83aaf42e85633c89f43a6253" - integrity sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/traverse" "^7.25.0" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" - integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - regexpu-core "^5.3.1" + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" - integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== +"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -173,165 +167,146 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-member-expression-to-functions@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" - integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== - dependencies: - "@babel/traverse" "^7.24.8" - "@babel/types" "^7.24.8" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" - integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.2" - -"@babel/helper-optimise-call-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" - integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== - dependencies: - "@babel/types" "^7.24.7" - -"@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.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" - integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== - -"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" - integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-wrap-function" "^7.25.0" - "@babel/traverse" "^7.25.0" - -"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" - integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.24.8" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/traverse" "^7.25.0" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" - integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" - integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== - -"@babel/helper-wrap-function@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" - integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== - dependencies: - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/helpers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" - integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== - dependencies: - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + +"@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.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" - integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.25.2" + "@babel/types" "^7.26.3" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" - integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" - integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" - integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" - integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" - integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-class-properties@^7.16.0": version "7.18.6" @@ -342,13 +317,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz#7e2dcfeda4a42596b57c4c9de1f5176bbfc532e3" - integrity sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz#8680707f943d1a3da2cd66b948179920f097e254" + integrity sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-decorators" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-decorators" "^7.25.9" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" @@ -402,7 +377,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -416,49 +391,35 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz#e4f8a0a8778ccec669611cd5aed1ed8e6e3a6fcf" - integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== +"@babel/plugin-syntax-decorators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz#986b4ca8b7b5df3f67cee889cedeffc2e2bf14b3" + integrity sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-flow@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7" - integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== +"@babel/plugin-syntax-flow@^7.25.9": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz#96507595c21b45fccfc2bc758d5c45452e6164fa" + integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" - integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -472,14 +433,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" - integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== +"@babel/plugin-syntax-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -493,7 +454,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -528,19 +489,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.24.7", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" - integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== +"@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -550,571 +511,551 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" - integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf" - integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q== +"@babel/plugin-transform-async-generator-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" + integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-remap-async-to-generator" "^7.25.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/traverse" "^7.25.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" - integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" - integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-block-scoping@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" - integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" - integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" - integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz#63122366527d88e0ef61b612554fe3f8c793991e" - integrity sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-replace-supers" "^7.25.0" - "@babel/traverse" "^7.25.0" +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" - integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/template" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" - integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" - integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-keys@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" - integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" - integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dynamic-import@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" - integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" - integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-export-namespace-from@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" - integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz#b3aa251db44959b7a7c82abcd6b4225dec7d2258" - integrity sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" + integrity sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/plugin-syntax-flow" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-flow" "^7.25.9" -"@babel/plugin-transform-for-of@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" - integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== +"@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-function-name@^7.25.1": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" - integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/traverse" "^7.25.1" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-json-strings@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" - integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-literals@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" - integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-logical-assignment-operators@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" - integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-member-expression-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" - integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" - integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" - integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== +"@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== dependencies: - "@babel/helper-module-transforms" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" - integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-module-transforms" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - "@babel/traverse" "^7.25.0" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-modules-umd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" - integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" - integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-new-target@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" - integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" - integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-numeric-separator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" - integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-rest-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" - integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-object-super@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" - integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-optional-catch-binding@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" - integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" - integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-parameters@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" - integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-methods@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" - integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-property-in-object@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" - integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-property-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" - integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.25.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz#71a665ed16ce618067d05f4a98130207349d82ae" - integrity sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz#08a1de35a301929b60fdf2788a54b46cd8ecd0ef" + integrity sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" - integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-development@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" - integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== +"@babel/plugin-transform-react-jsx-development@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7" + integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== dependencies: - "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.25.9" -"@babel/plugin-transform-react-jsx-self@^7.24.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" - integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== +"@babel/plugin-transform-react-jsx-self@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" + integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-source@^7.24.1": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" - integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== +"@babel/plugin-transform-react-jsx-source@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" + integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx@^7.24.7": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" - integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/types" "^7.25.2" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/plugin-transform-react-pure-annotations@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" - integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== +"@babel/plugin-transform-react-pure-annotations@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62" + integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-regenerator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" - integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" - integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-runtime@^7.16.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" - integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" + integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" - integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" - integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-sticky-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" - integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-template-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" - integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== +"@babel/plugin-transform-template-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" - integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typescript@^7.24.7": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" - integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A== +"@babel/plugin-transform-typescript@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" + integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.25.0" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-syntax-typescript" "^7.24.7" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-syntax-typescript" "^7.25.9" -"@babel/plugin-transform-unicode-escapes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" - integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-property-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" - integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" - integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-sets-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" - integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c" - integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g== - dependencies: - "@babel/compat-data" "^7.25.2" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-option" "^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" + integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== + dependencies: + "@babel/compat-data" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" "@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.24.7" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@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" - "@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-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.25.0" - "@babel/plugin-transform-async-to-generator" "^7.24.7" - "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.25.0" - "@babel/plugin-transform-class-properties" "^7.24.7" - "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.25.0" - "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.8" - "@babel/plugin-transform-dotall-regex" "^7.24.7" - "@babel/plugin-transform-duplicate-keys" "^7.24.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" - "@babel/plugin-transform-dynamic-import" "^7.24.7" - "@babel/plugin-transform-exponentiation-operator" "^7.24.7" - "@babel/plugin-transform-export-namespace-from" "^7.24.7" - "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.25.1" - "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.25.2" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" - "@babel/plugin-transform-member-expression-literals" "^7.24.7" - "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.8" - "@babel/plugin-transform-modules-systemjs" "^7.25.0" - "@babel/plugin-transform-modules-umd" "^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" - "@babel/plugin-transform-new-target" "^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" - "@babel/plugin-transform-numeric-separator" "^7.24.7" - "@babel/plugin-transform-object-rest-spread" "^7.24.7" - "@babel/plugin-transform-object-super" "^7.24.7" - "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.8" - "@babel/plugin-transform-parameters" "^7.24.7" - "@babel/plugin-transform-private-methods" "^7.24.7" - "@babel/plugin-transform-private-property-in-object" "^7.24.7" - "@babel/plugin-transform-property-literals" "^7.24.7" - "@babel/plugin-transform-regenerator" "^7.24.7" - "@babel/plugin-transform-reserved-words" "^7.24.7" - "@babel/plugin-transform-shorthand-properties" "^7.24.7" - "@babel/plugin-transform-spread" "^7.24.7" - "@babel/plugin-transform-sticky-regex" "^7.24.7" - "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.8" - "@babel/plugin-transform-unicode-escapes" "^7.24.7" - "@babel/plugin-transform-unicode-property-regex" "^7.24.7" - "@babel/plugin-transform-unicode-regex" "^7.24.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.37.1" + core-js-compat "^3.38.1" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1127,77 +1068,64 @@ esutils "^2.0.2" "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" - integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.26.3.tgz#7c5e028d623b4683c1f83a0bd4713b9100560caa" + integrity sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-transform-react-display-name" "^7.24.7" - "@babel/plugin-transform-react-jsx" "^7.24.7" - "@babel/plugin-transform-react-jsx-development" "^7.24.7" - "@babel/plugin-transform-react-pure-annotations" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-react-display-name" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx-development" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations" "^7.25.9" "@babel/preset-typescript@^7.16.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" - integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" - "@babel/plugin-transform-typescript" "^7.24.7" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" - integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== dependencies: - regenerator-runtime "^0.14.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" -"@babel/runtime@^7.20.13": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.21.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.7", "@babel/runtime@^7.25.0", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.7.2": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" - integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/parser" "^7.25.3" - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.2" +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.7.2": + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" - integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -1205,9 +1133,9 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@bufbuild/protobuf@^2.0.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.2.2.tgz#1a6d89603fb215dc4d4178052d05b30b83c75402" - integrity sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A== + version "2.2.3" + resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.2.3.tgz#9cd136f6b687e63e9b517b3a54211ece942897ee" + integrity sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg== "@csstools/normalize.css@*": version "12.1.1" @@ -1320,146 +1248,153 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== +"@esbuild/aix-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" + integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== + +"@esbuild/android-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" + integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== + +"@esbuild/android-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" + integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== + +"@esbuild/android-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" + integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== + +"@esbuild/darwin-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" + integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== + +"@esbuild/darwin-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" + integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== + +"@esbuild/freebsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" + integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== + +"@esbuild/freebsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" + integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== + +"@esbuild/linux-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" + integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== + +"@esbuild/linux-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" + integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== + +"@esbuild/linux-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" + integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== + +"@esbuild/linux-loong64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" + integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== + +"@esbuild/linux-mips64el@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" + integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== + +"@esbuild/linux-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" + integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== + +"@esbuild/linux-riscv64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" + integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== + +"@esbuild/linux-s390x@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" + integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== + +"@esbuild/linux-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" + integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== + +"@esbuild/netbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" + integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== + +"@esbuild/openbsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" + integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== + +"@esbuild/openbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" + integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== + +"@esbuild/sunos-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" + integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== + +"@esbuild/win32-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" + integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== + +"@esbuild/win32-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" + integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== + +"@esbuild/win32-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" + integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/config-array@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" - integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== +"@eslint/config-array@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== dependencies: - "@eslint/object-schema" "^2.1.4" + "@eslint/object-schema" "^2.1.5" debug "^4.3.1" minimatch "^3.1.2" -"@eslint/core@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.7.0.tgz#a1bb4b6a4e742a5ff1894b7ee76fbf884ec72bd3" - integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== +"@eslint/core@^0.9.0": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.9.1.tgz#31763847308ef6b7084a4505573ac9402c51f9d1" + integrity sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== + dependencies: + "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1476,10 +1411,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" - integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== +"@eslint/eslintrc@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1491,25 +1426,25 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@eslint/js@9.13.0": - version "9.13.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.13.0.tgz#c5f89bcd57eb54d5d4fa8b77693e9c28dc97e547" - integrity sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA== +"@eslint/js@9.16.0": + version "9.16.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.16.0.tgz#3df2b2dd3b9163056616886c86e4082f45dbf3f4" + integrity sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg== -"@eslint/object-schema@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" - integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== -"@eslint/plugin-kit@^0.2.0": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz#5eff371953bc13e3f4d88150e2c53959f64f74f6" - integrity sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw== +"@eslint/plugin-kit@^0.2.3": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz#2b78e7bb3755784bb13faa8932a1d994d6537792" + integrity sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== dependencies: levn "^0.4.1" @@ -1518,31 +1453,31 @@ resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== -"@fortawesome/fontawesome-common-types@6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz#31ab07ca6a06358c5de4d295d4711b675006163f" - integrity sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw== +"@fortawesome/fontawesome-common-types@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.1.tgz#6201640f39fdcf8e41cd9d1a92b2da3a96817fa4" + integrity sha512-gbDz3TwRrIPT3i0cDfujhshnXO9z03IT1UKRIVi/VEjpNHtSBIP2o5XSm+e816FzzCFEzAxPw09Z13n20PaQJQ== "@fortawesome/fontawesome-svg-core@^6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz#2a24c32ef92136e98eae2ff334a27145188295ff" - integrity sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg== + version "6.7.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.1.tgz#1f8ebb6f35cf02f89c110198514e848de17ac99e" + integrity sha512-8dBIHbfsKlCk2jHQ9PoRBg2Z+4TwyE3vZICSnoDlnsHA6SiMlTwfmW6yX0lHsRmWJugkeb92sA0hZdkXJhuz+g== dependencies: - "@fortawesome/fontawesome-common-types" "6.6.0" + "@fortawesome/fontawesome-common-types" "6.7.1" "@fortawesome/free-regular-svg-icons@^6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.6.0.tgz#fc49a947ac8dfd20403c9ea5f37f0919425bdf04" - integrity sha512-Yv9hDzL4aI73BEwSEh20clrY8q/uLxawaQ98lekBx6t9dQKDHcDzzV1p2YtBGTtolYtNqcWdniOnhzB+JPnQEQ== + version "6.7.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.1.tgz#d7ec06f896ee91116a388a5a234cd26420ccdfe4" + integrity sha512-e13cp+bAx716RZOTQ59DhqikAgETA9u1qTBHO3e3jMQQ+4H/N1NC1ZVeFYt1V0m+Th68BrEL1/X6XplISutbXg== dependencies: - "@fortawesome/fontawesome-common-types" "6.6.0" + "@fortawesome/fontawesome-common-types" "6.7.1" "@fortawesome/free-solid-svg-icons@^6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz#061751ca43be4c4d814f0adbda8f006164ec9f3b" - integrity sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA== + version "6.7.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.1.tgz#c1f9a6c25562a12c283e87e284f9d82a5b0dbcc0" + integrity sha512-BTKc0b0mgjWZ2UDKVgmwaE0qt0cZs6ITcDgjrti5f/ki7aF5zs+N91V6hitGo3TItCFtnKg6cUVGdTmBFICFRg== dependencies: - "@fortawesome/fontawesome-common-types" "6.6.0" + "@fortawesome/fontawesome-common-types" "6.7.1" "@fortawesome/react-fontawesome@^0.2.2": version "0.2.2" @@ -1556,7 +1491,7 @@ resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== -"@humanfs/node@^0.16.5": +"@humanfs/node@^0.16.6": version "0.16.6" resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== @@ -1564,12 +1499,12 @@ "@humanfs/core" "^0.19.1" "@humanwhocodes/retry" "^0.3.0" -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -1578,21 +1513,21 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@humanwhocodes/retry@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" - integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== - -"@humanwhocodes/retry@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== +"@humanwhocodes/retry@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" + integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1909,6 +1844,95 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" + integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== + +"@parcel/watcher-darwin-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" + integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== + +"@parcel/watcher-darwin-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" + integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== + +"@parcel/watcher-freebsd-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" + integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== + +"@parcel/watcher-linux-arm-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" + integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== + +"@parcel/watcher-linux-arm-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" + integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== + +"@parcel/watcher-linux-arm64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" + integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== + +"@parcel/watcher-linux-arm64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" + integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== + +"@parcel/watcher-linux-x64-glibc@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" + integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== + +"@parcel/watcher-linux-x64-musl@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" + integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== + +"@parcel/watcher-win32-arm64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" + integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== + +"@parcel/watcher-win32-ia32@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" + integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== + +"@parcel/watcher-win32-x64@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" + integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== + +"@parcel/watcher@^2.4.1": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" + integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.0" + "@parcel/watcher-darwin-arm64" "2.5.0" + "@parcel/watcher-darwin-x64" "2.5.0" + "@parcel/watcher-freebsd-x64" "2.5.0" + "@parcel/watcher-linux-arm-glibc" "2.5.0" + "@parcel/watcher-linux-arm-musl" "2.5.0" + "@parcel/watcher-linux-arm64-glibc" "2.5.0" + "@parcel/watcher-linux-arm64-musl" "2.5.0" + "@parcel/watcher-linux-x64-glibc" "2.5.0" + "@parcel/watcher-linux-x64-musl" "2.5.0" + "@parcel/watcher-win32-arm64" "2.5.0" + "@parcel/watcher-win32-ia32" "2.5.0" + "@parcel/watcher-win32-x64" "2.5.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -1932,32 +1956,32 @@ schema-utils "^4.2.0" source-map "^0.7.3" -"@popperjs/core@^2.11.6": +"@popperjs/core@^2.11.8": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@react-aria/ssr@^3.5.0": - version "3.9.5" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.5.tgz#775d84f51f90934ff51ae74eeba3728daac1a381" - integrity sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ== + version "3.9.7" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.7.tgz#d89d129f7bbc5148657e6c952ac31c9353183770" + integrity sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg== dependencies: "@swc/helpers" "^0.5.0" "@reduxjs/toolkit@^2.2.4": - version "2.2.7" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.7.tgz#199e3d10ccb39267cb5aee92c0262fd9da7fdfb2" - integrity sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g== + version "2.4.0" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.4.0.tgz#29fd3a19530fc50d648a9b1e0132da0cd5618f19" + integrity sha512-wJZEuSKj14tvNfxiIiJws0tQN77/rDqucBq528ApebMIRHyWpCanJVQRxQ8WWZC19iCDKxDsGlbAir3F1layxA== dependencies: immer "^10.0.3" redux "^5.0.1" redux-thunk "^3.1.0" reselect "^5.1.0" -"@remix-run/router@1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.0.tgz#745dbffbce67f05386d57ca22c51dfd85c979593" - integrity sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA== +"@remix-run/router@1.21.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5" + integrity sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA== "@restart/hooks@^0.4.9": version "0.4.16" @@ -1966,19 +1990,26 @@ dependencies: dequal "^2.0.3" -"@restart/ui@^1.6.9": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.8.0.tgz#3e8d80822b5fbef0576f94acda51d7da9e79e005" - integrity sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g== +"@restart/hooks@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.5.0.tgz#a594af7c3b64f5e65a7aca011551b0cdd93ec14e" + integrity sha512-wS+h6IusJCPjTkmOOrRZxIPICD/mtFA3PRZviutoM23/b7akyDGfZF/WS+nIFk27u7JDhPE2+0GBdZxjSqHZkg== + dependencies: + dequal "^2.0.3" + +"@restart/ui@^1.9.0": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.9.1.tgz#f0f22d255470e02f6fee6dcc449e56f0f1b8ebc1" + integrity sha512-qghR21ynHiUrpcIkKCoKYB+3rJtezY5Y7ikrwradCL+7hZHdQ2Ozc5ffxtpmpahoAGgc31gyXaSx2sXXaThmqA== dependencies: - "@babel/runtime" "^7.21.0" - "@popperjs/core" "^2.11.6" + "@babel/runtime" "^7.26.0" + "@popperjs/core" "^2.11.8" "@react-aria/ssr" "^3.5.0" - "@restart/hooks" "^0.4.9" - "@types/warning" "^3.0.0" + "@restart/hooks" "^0.5.0" + "@types/warning" "^3.0.3" dequal "^2.0.3" dom-helpers "^5.2.0" - uncontrollable "^8.0.1" + uncontrollable "^8.0.4" warning "^4.0.3" "@rollup/plugin-babel@^5.2.0": @@ -2018,98 +2049,119 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/rollup-android-arm-eabi@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54" - integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA== - -"@rollup/rollup-android-arm64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e" - integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA== - -"@rollup/rollup-darwin-arm64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz#627007221b24b8cc3063703eee0b9177edf49c1f" - integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA== - -"@rollup/rollup-darwin-x64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz#0605506142b9e796c370d59c5984ae95b9758724" - integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb" - integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA== - -"@rollup/rollup-linux-arm-musleabihf@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3" - integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw== - -"@rollup/rollup-linux-arm64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496" - integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA== - -"@rollup/rollup-linux-arm64-musl@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065" - integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d" - integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw== - -"@rollup/rollup-linux-riscv64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983" - integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg== - -"@rollup/rollup-linux-s390x-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58" - integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g== - -"@rollup/rollup-linux-x64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b" - integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A== - -"@rollup/rollup-linux-x64-musl@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127" - integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ== - -"@rollup/rollup-win32-arm64-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5" - integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ== - -"@rollup/rollup-win32-ia32-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2" - integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ== - -"@rollup/rollup-win32-x64-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" - integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== - -"@rtk-query/codegen-openapi@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@rtk-query/codegen-openapi/-/codegen-openapi-1.2.0.tgz#2c63cbbd80382c4ba6c9fab5e9004efb43637de3" - integrity sha512-Sru3aPHyFC0Tb7jeFh/kVMGBdQUcofb9frrHhjNSRLEoJWsG9fjaioUx3nPT5HZVbdAvAFF4xMWFQNfgJBrAGw== +"@rollup/rollup-android-arm-eabi@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" + integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== + +"@rollup/rollup-android-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" + integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== + +"@rollup/rollup-darwin-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999" + integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== + +"@rollup/rollup-darwin-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" + integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== + +"@rollup/rollup-freebsd-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" + integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== + +"@rollup/rollup-freebsd-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" + integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" + integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== + +"@rollup/rollup-linux-arm-musleabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" + integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== + +"@rollup/rollup-linux-arm64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" + integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== + +"@rollup/rollup-linux-arm64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" + integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== + +"@rollup/rollup-linux-loongarch64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" + integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" + integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== + +"@rollup/rollup-linux-riscv64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" + integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== + +"@rollup/rollup-linux-s390x-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" + integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== + +"@rollup/rollup-linux-x64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" + integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== + +"@rollup/rollup-linux-x64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" + integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== + +"@rollup/rollup-win32-arm64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" + integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== + +"@rollup/rollup-win32-ia32-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" + integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== + +"@rollup/rollup-win32-x64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" + integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== + +"@rtk-query/codegen-openapi@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@rtk-query/codegen-openapi/-/codegen-openapi-2.0.0.tgz#4ef9a2055f64a441a772912630cd8b13e091905d" + integrity sha512-uIOshfqX6bcsMpiwUMKAC+oFEw2fUxICMruhXunB6wq7tHpUg2b+gz+qGjiWAWw1Ly6g6jjvb3N4HRxWy9Yqew== dependencies: "@apidevtools/swagger-parser" "^10.0.2" commander "^6.2.0" - oazapfts "^4.8.0" - prettier "^2.2.1" + lodash.camelcase "^4.3.0" + oazapfts "^6.1.0" + prettier "^3.2.5" semver "^7.3.5" swagger2openapi "^7.0.4" - typescript "^5.0.0" + typescript "^5.5.4" + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@rushstack/eslint-patch@^1.1.0": version "1.10.4" @@ -2249,19 +2301,18 @@ loader-utils "^2.0.0" "@swc/helpers@^0.5.0": - version "0.5.12" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" - integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g== + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== dependencies: - tslib "^2.4.0" + tslib "^2.8.0" "@testing-library/jest-dom@^6.4.8": - version "6.4.8" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz#9c435742b20c6183d4e7034f2b329d562c079daa" - integrity sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw== + version "6.6.3" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz#26ba906cf928c0f8172e182c6fe214eb4f9f2bd2" + integrity sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA== dependencies: "@adobe/css-tools" "^4.4.0" - "@babel/runtime" "^7.9.2" aria-query "^5.0.0" chalk "^3.0.0" css.escape "^1.5.1" @@ -2270,9 +2321,9 @@ redent "^3.0.0" "@testing-library/react@^16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.0.tgz#0a1e0c7a3de25841c3591b8cb7fb0cf0c0a27321" - integrity sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ== + version "16.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.1.0.tgz#aa0c61398bac82eaf89776967e97de41ac742d71" + integrity sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg== dependencies: "@babel/runtime" "^7.12.5" @@ -2354,7 +2405,7 @@ dependencies: "@types/node" "*" -"@types/eslint-scope@^3.7.3": +"@types/eslint-scope@^3.7.7": version "3.7.7" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== @@ -2363,47 +2414,62 @@ "@types/estree" "*" "@types/eslint@*": - version "9.6.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.0.tgz#51d4fe4d0316da9e9f2c80884f2c20ed5fb022ff" - integrity sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg== + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/eslint@^7.29.0 || ^8.4.1": - version "8.56.11" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.11.tgz#e2ff61510a3b9454b3329fe7731e3b4c6f780041" - integrity sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q== + version "8.56.12" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a" + integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@1.0.6", "@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.13": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -2431,9 +2497,9 @@ integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": - version "1.17.14" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" - integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + version "1.17.15" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" + integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== dependencies: "@types/node" "*" @@ -2479,11 +2545,11 @@ "@types/node" "*" "@types/node@*": - version "22.1.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.1.0.tgz#6d6adc648b5e03f0e83c78dc788c2b037d0ad94b" - integrity sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw== + version "22.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== dependencies: - undici-types "~6.13.0" + undici-types "~6.20.0" "@types/parse-json@^4.0.0": version "4.0.2" @@ -2496,9 +2562,9 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== "@types/q@^1.5.1": version "1.5.8" @@ -2506,9 +2572,9 @@ integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw== "@types/qs@*": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + version "6.9.17" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" + integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== "@types/range-parser@*": version "1.2.7" @@ -2516,23 +2582,28 @@ integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-dom@^18.2.22": - version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== - dependencies: - "@types/react" "*" + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.3.tgz#3654138d0da1b0c7916f6ed0dc1cc2b576d47650" + integrity sha512-uTYkxTLkYp41nq/ULXyXMtkNT1vu5fXJoqad6uTNCOGat5t9cLgF4vMNLBXsTOXpdOI44XzKPY1M5RRm0bQHuw== "@types/react-transition-group@^4.4.6": - version "4.4.10" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" - integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + version "4.4.11" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5" + integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.2.66": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" - integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== +"@types/react@*", "@types/react@>=16.9.11": + version "19.0.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.1.tgz#a000d5b78f473732a08cecbead0f3751e550b3df" + integrity sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ== + dependencies: + csstype "^3.0.2" + +"@types/react@^18.2.66": + version "18.3.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.15.tgz#14674f041072c2b17062ae2edb0eb95a45787f98" + integrity sha512-XQzbwkCwrsabawgWsvDDwsDTRuH1sf6Uj1fnFYoG03ZXfT54/aBvlylKR9ix70pXAtTn8dFzj358zVcZN4m83w== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -2595,20 +2666,20 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/use-sync-external-store@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" - integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== +"@types/use-sync-external-store@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc" + integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== -"@types/warning@^3.0.0": +"@types/warning@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== "@types/ws@^8.5.5": - version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" - integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + version "8.5.13" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" + integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== dependencies: "@types/node" "*" @@ -2625,22 +2696,22 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.0.tgz#2089acb441fb5e0171e1b4cfb4291d22fb3779c0" - integrity sha512-uRqchEKT0/OwDePTwCjSFO2aH4zccdeQ7DgAzM/8fuXc+PAXvpdMRbuo+oCmK1lSfXssk2UUBNiWihobKxQp/g== +"@typescript-eslint/eslint-plugin@8.18.0", "@typescript-eslint/eslint-plugin@^8.0.1": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz#0901933326aea4443b81df3f740ca7dfc45c7bea" + integrity sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.12.0" - "@typescript-eslint/type-utils" "8.12.0" - "@typescript-eslint/utils" "8.12.0" - "@typescript-eslint/visitor-keys" "8.12.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/type-utils" "8.18.0" + "@typescript-eslint/utils" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" @@ -2662,21 +2733,6 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/eslint-plugin@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz#5dbd1b498fdea83a16d292322d27d293ce156f94" - integrity sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.0.1" - "@typescript-eslint/type-utils" "8.0.1" - "@typescript-eslint/utils" "8.0.1" - "@typescript-eslint/visitor-keys" "8.0.1" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - "@typescript-eslint/experimental-utils@^5.0.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" @@ -2684,15 +2740,15 @@ dependencies: "@typescript-eslint/utils" "5.62.0" -"@typescript-eslint/parser@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.12.0.tgz#e9a9c047310213169dd500b08622c5641f1997f6" - integrity sha512-7U20duDQWAOhCk2VtyY41Vor/CJjiEW063Zel9aoRXq89FQ/jr+0e0m3kxh9Sk5SFW9B1AblVIBtXd+1xQ1NWQ== +"@typescript-eslint/parser@8.18.0", "@typescript-eslint/parser@^8.0.1": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.18.0.tgz#a1c9456cbb6a089730bf1d3fc47946c5fb5fe67b" + integrity sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q== dependencies: - "@typescript-eslint/scope-manager" "8.12.0" - "@typescript-eslint/types" "8.12.0" - "@typescript-eslint/typescript-estree" "8.12.0" - "@typescript-eslint/visitor-keys" "8.12.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/typescript-estree" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" debug "^4.3.4" "@typescript-eslint/parser@^5.5.0": @@ -2705,17 +2761,6 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/parser@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.0.1.tgz#eb0728147a3a79edf43dde84c797f117213bbfdb" - integrity sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg== - dependencies: - "@typescript-eslint/scope-manager" "8.0.1" - "@typescript-eslint/types" "8.0.1" - "@typescript-eslint/typescript-estree" "8.0.1" - "@typescript-eslint/visitor-keys" "8.0.1" - debug "^4.3.4" - "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -2724,21 +2769,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz#544259c29e1ebf65d30b6e99a9f420d98795a54e" - integrity sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ== - dependencies: - "@typescript-eslint/types" "8.0.1" - "@typescript-eslint/visitor-keys" "8.0.1" - -"@typescript-eslint/scope-manager@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.12.0.tgz#de23a4a652773efdd558c7e5ff7b734736f14318" - integrity sha512-jbuCXK18iEshRFUtlCIMAmOKA6OAsKjo41UcXPqx7ZWh2b4cmg6pV/pNcZSB7oW9mtgF95yizr7Jnwt3IUD2pA== +"@typescript-eslint/scope-manager@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz#30b040cb4557804a7e2bcc65cf8fdb630c96546f" + integrity sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw== dependencies: - "@typescript-eslint/types" "8.12.0" - "@typescript-eslint/visitor-keys" "8.12.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" "@typescript-eslint/type-utils@5.62.0": version "5.62.0" @@ -2750,23 +2787,13 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz#a613ee2dfeed4a9781300b5d326ec7cf946eed92" - integrity sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng== - dependencies: - "@typescript-eslint/typescript-estree" "8.0.1" - "@typescript-eslint/utils" "8.0.1" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/type-utils@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.12.0.tgz#d1e2d2ed0b2cb5bca35312b085379fcfb5c812be" - integrity sha512-cHioAZO/nLgyzTmwv7gWIjEKMHSbioKEZqLCaItTn7RvJP1QipuGVwEjPJa6Kv9u9UiUMVAESY9JH186TjKITw== +"@typescript-eslint/type-utils@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz#6f0d12cf923b6fd95ae4d877708c0adaad93c471" + integrity sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow== dependencies: - "@typescript-eslint/typescript-estree" "8.12.0" - "@typescript-eslint/utils" "8.12.0" + "@typescript-eslint/typescript-estree" "8.18.0" + "@typescript-eslint/utils" "8.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -2775,15 +2802,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.0.1.tgz#333e2f4c158952dbc8181a4ddcc6e49898a28918" - integrity sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw== - -"@typescript-eslint/types@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.12.0.tgz#f35d846af8e2248a7e2136fe714a42be3b3154ef" - integrity sha512-Cc+iNtqBJ492f8KLEmKXe1l6683P0MlFO8Bk1NMphnzVIGH4/Wn9kvandFH+gYR1DDUjH/hgeWRGdO5Tj8gjYg== +"@typescript-eslint/types@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.18.0.tgz#3afcd30def8756bc78541268ea819a043221d5f3" + integrity sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -2798,27 +2820,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz#64575ec7b77aedfe497acdfb2779ec942bb8d866" - integrity sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w== - dependencies: - "@typescript-eslint/types" "8.0.1" - "@typescript-eslint/visitor-keys" "8.0.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/typescript-estree@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.0.tgz#6e087bd46f7682c07e971fb1d9dfa5bdc6f45f64" - integrity sha512-a4koVV7HHVOQWcGb6ZcAlunJnAdwo/CITRbleQBSjq5+2WLoAJQCAAiecvrAdSM+n/man6Ghig5YgdGVIC6xqw== +"@typescript-eslint/typescript-estree@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz#d8ca785799fbb9c700cdff1a79c046c3e633c7f9" + integrity sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg== dependencies: - "@typescript-eslint/types" "8.12.0" - "@typescript-eslint/visitor-keys" "8.12.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -2840,25 +2848,15 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.0.1.tgz#b48e3320c4f9011f97d25e0588b8c143adc38d2a" - integrity sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.0.1" - "@typescript-eslint/types" "8.0.1" - "@typescript-eslint/typescript-estree" "8.0.1" - -"@typescript-eslint/utils@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.12.0.tgz#2967a5915ad4c500486341c79c0cfbc4f276bf47" - integrity sha512-5i1tqLwlf0fpX1j05paNKyIzla/a4Y3Xhh6AFzi0do/LDJLvohtZYaisaTB9kq0D4uBocAxWDTGzNMOCCwIgXA== +"@typescript-eslint/utils@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.18.0.tgz#48f67205d42b65d895797bb7349d1be5c39a62f7" + integrity sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.12.0" - "@typescript-eslint/types" "8.12.0" - "@typescript-eslint/typescript-estree" "8.12.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/typescript-estree" "8.18.0" "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" @@ -2868,157 +2866,149 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz#e5816803b4dad1de5e97f00df8dc15d0bcb49778" - integrity sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ== +"@typescript-eslint/visitor-keys@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz#7b6d33534fa808e33a19951907231ad2ea5c36dd" + integrity sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw== dependencies: - "@typescript-eslint/types" "8.0.1" - eslint-visitor-keys "^3.4.3" - -"@typescript-eslint/visitor-keys@8.12.0": - version "8.12.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.0.tgz#a9fcd973a546a7c78593d0501debdc9ebab8b340" - integrity sha512-2rXkr+AtZZLuNY18aUjv5wtB9oUiwY1WnNi7VTsdCdy1m958ULeUKoAegldQTjqpbpNJ5cQ4egR8/bh5tbrKKQ== - dependencies: - "@typescript-eslint/types" "8.12.0" - eslint-visitor-keys "^3.4.3" + "@typescript-eslint/types" "8.18.0" + eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== "@vitejs/plugin-react@^4.2.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" - integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== + version "4.3.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz#c64be10b54c4640135a5b28a2432330e88ad7c20" + integrity sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug== dependencies: - "@babel/core" "^7.24.5" - "@babel/plugin-transform-react-jsx-self" "^7.24.5" - "@babel/plugin-transform-react-jsx-source" "^7.24.1" + "@babel/core" "^7.26.0" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" "@types/babel__core" "^7.20.5" react-refresh "^0.14.2" -"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== dependencies: - "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -3036,7 +3026,7 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3052,11 +3042,6 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -3072,10 +3057,10 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.12.0, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.14.0, acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== address@^1.0.1, address@^1.1.2: version "1.2.2" @@ -3164,9 +3149,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" @@ -3222,21 +3207,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.0.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -aria-query@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" +aria-query@^5.0.0, aria-query@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== -array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -3249,7 +3225,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: +array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -3278,7 +3254,7 @@ array.prototype.findlast@^1.2.5: es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" -array.prototype.findlastindex@^1.2.3: +array.prototype.findlastindex@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== @@ -3348,7 +3324,7 @@ arraybuffer.prototype.slice@^1.0.3: is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" -asap@~2.0.3, asap@~2.0.6: +asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== @@ -3359,9 +3335,9 @@ ast-types-flow@^0.0.8: integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -3392,17 +3368,15 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axe-core@^4.9.1: - version "4.10.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" - integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== +axe-core@^4.10.0: + version "4.10.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== -axobject-query@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" @@ -3419,12 +3393,12 @@ babel-jest@^27.4.2, babel-jest@^27.5.1: slash "^3.0.0" babel-loader@^8.2.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + version "8.4.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675" + integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== dependencies: find-cache-dir "^3.3.1" - loader-utils "^2.0.0" + loader-utils "^2.0.4" make-dir "^3.1.0" schema-utils "^2.6.5" @@ -3464,15 +3438,15 @@ babel-plugin-named-asset-import@^0.3.8: integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.11" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" - integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== + version "0.4.12" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: +babel-plugin-polyfill-corejs3@^0.10.6: version "0.10.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== @@ -3481,11 +3455,11 @@ babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" - integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== + version "0.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" + "@babel/helper-define-polyfill-provider" "^0.6.3" babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" @@ -3493,22 +3467,25 @@ babel-plugin-transform-react-remove-prop-types@^0.4.24: integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^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.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-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^27.5.1: version "27.5.1" @@ -3545,11 +3522,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -3581,10 +3553,10 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" content-type "~1.0.5" @@ -3594,15 +3566,15 @@ body-parser@1.20.2: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.11.0" + qs "6.13.0" raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" - integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" + integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== dependencies: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -3644,15 +3616,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.23.1, browserslist@^4.23.3: - version "4.23.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" - integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== +browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.2: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001646" - electron-to-chromium "^1.5.4" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" node-releases "^2.0.18" - update-browserslist-db "^1.1.0" + update-browserslist-db "^1.1.1" bser@2.1.1: version "2.1.1" @@ -3676,11 +3648,6 @@ builtin-modules@^3.1.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -3691,16 +3658,23 @@ cac@^6.7.14: resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" call-me-maybe@^1.0.1: version "1.0.2" @@ -3745,17 +3719,17 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646: - version "1.0.30001649" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz#3ec700309ca0da2b0d3d5fb03c411b191761c992" - integrity sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: + version "1.0.30001687" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae" + integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== -chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3786,16 +3760,16 @@ char-regex@^1.0.2: integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== char-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" - integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.2.tgz#81385bb071af4df774bff8721d0ca15ef29ea0bb" + integrity sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg== check-types@^11.2.3: version "11.2.3" resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.3: +chokidar@^3.4.2, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3810,6 +3784,13 @@ check-types@^11.2.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chrome-trace-event@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" @@ -3821,9 +3802,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== classnames@^2.3.2: version "2.5.1" @@ -3960,7 +3941,7 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -3968,16 +3949,16 @@ compressible@~2.0.16: mime-db ">= 1.43.0 < 2" compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" + negotiator "~0.6.4" on-headers "~1.0.2" - safe-buffer "5.1.2" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -4022,27 +4003,27 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== -core-js-compat@^3.37.1, core-js-compat@^3.38.0: - version "3.38.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.0.tgz#d93393b1aa346b6ee683377b0c31172ccfe607aa" - integrity sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A== +core-js-compat@^3.38.0, core-js-compat@^3.38.1: + version "3.39.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" + integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== dependencies: - browserslist "^4.23.3" + browserslist "^4.24.2" core-js-pure@^3.23.3: - version "3.38.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.38.0.tgz#bc802cd152e33d5b0ec733b656c71cb847cac701" - integrity sha512-8balb/HAXo06aHP58mZMtXgD8vcnXz9tUDePgqBgJgKdmTlMt+jw3ujqniuBDQXMvTzxnMpxHFeuSM3g1jWQuQ== + version "3.39.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.39.0.tgz#aa0d54d70a15bdc13e7c853db87c10abc30d68f3" + integrity sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg== core-js@^3.19.2: - version "3.38.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.0.tgz#8acb7c050bf2ccbb35f938c0d040132f6110f636" - integrity sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug== + version "3.39.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.39.0.tgz#57f7647f4d2d030c32a72ea23a0555b2eaa30f83" + integrity sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g== core-util-is@~1.0.0: version "1.0.3" @@ -4071,17 +4052,10 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -4336,11 +4310,11 @@ debug@2.6.9, debug@^2.6.0: 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.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -4359,30 +4333,6 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - 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.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -4448,6 +4398,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -4612,6 +4567,15 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dunder-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.0.tgz#c2fce098b3c8f8899554905f4377b6d85dabaa80" + integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -4634,10 +4598,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz#03bfdf422bdd2c05ee2657efedde21264a1a566b" - integrity sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA== +electron-to-chromium@^1.5.41: + version "1.5.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df" + integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw== emittery@^0.10.2: version "0.10.2" @@ -4669,7 +4633,12 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^5.17.0: +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +enhanced-resolve@^5.17.1: version "5.17.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -4696,10 +4665,10 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== +es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5: + version "1.23.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" @@ -4716,7 +4685,7 @@ es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22 function.prototype.name "^1.1.6" get-intrinsic "^1.2.4" get-symbol-description "^1.0.2" - globalthis "^1.0.3" + globalthis "^1.0.4" gopd "^1.0.1" has-property-descriptors "^1.0.2" has-proto "^1.0.3" @@ -4732,10 +4701,10 @@ es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22 is-string "^1.0.7" is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.13.1" + object-inspect "^1.13.3" object-keys "^1.1.1" object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" + regexp.prototype.flags "^1.5.3" safe-array-concat "^1.1.2" safe-regex-test "^1.0.3" string.prototype.trim "^1.2.9" @@ -4753,37 +4722,20 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - 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" - -es-iterator-helpers@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== +es-iterator-helpers@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz#2f1a3ab998b30cb2d10b195b587c6d9ebdebf152" + integrity sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" @@ -4792,12 +4744,13 @@ es-iterator-helpers@^1.0.19: es-set-tostringtag "^2.0.3" function-bind "^1.1.2" get-intrinsic "^1.2.4" - globalthis "^1.0.3" + globalthis "^1.0.4" + gopd "^1.0.1" has-property-descriptors "^1.0.2" has-proto "^1.0.3" has-symbols "^1.0.3" internal-slot "^1.0.7" - iterator.prototype "^1.1.2" + iterator.prototype "^1.1.3" safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: @@ -4829,52 +4782,53 @@ es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: hasown "^2.0.0" es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es6-promise@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== +esbuild@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" + integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + "@esbuild/aix-ppc64" "0.24.0" + "@esbuild/android-arm" "0.24.0" + "@esbuild/android-arm64" "0.24.0" + "@esbuild/android-x64" "0.24.0" + "@esbuild/darwin-arm64" "0.24.0" + "@esbuild/darwin-x64" "0.24.0" + "@esbuild/freebsd-arm64" "0.24.0" + "@esbuild/freebsd-x64" "0.24.0" + "@esbuild/linux-arm" "0.24.0" + "@esbuild/linux-arm64" "0.24.0" + "@esbuild/linux-ia32" "0.24.0" + "@esbuild/linux-loong64" "0.24.0" + "@esbuild/linux-mips64el" "0.24.0" + "@esbuild/linux-ppc64" "0.24.0" + "@esbuild/linux-riscv64" "0.24.0" + "@esbuild/linux-s390x" "0.24.0" + "@esbuild/linux-x64" "0.24.0" + "@esbuild/netbsd-x64" "0.24.0" + "@esbuild/openbsd-arm64" "0.24.0" + "@esbuild/openbsd-x64" "0.24.0" + "@esbuild/sunos-x64" "0.24.0" + "@esbuild/win32-arm64" "0.24.0" + "@esbuild/win32-ia32" "0.24.0" + "@esbuild/win32-x64" "0.24.0" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -4970,10 +4924,10 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" @@ -4986,26 +4940,28 @@ eslint-plugin-flowtype@^8.0.3: string-natural-compare "^3.0.1" eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-plugin-jest@^25.3.0: @@ -5016,26 +4972,25 @@ eslint-plugin-jest@^25.3.0: "@typescript-eslint/experimental-utils" "^5.0.0" eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: - version "6.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" - integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== + version "6.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483" + integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q== dependencies: - aria-query "~5.1.3" + aria-query "^5.3.2" array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "^4.9.1" - axobject-query "~3.1.1" + axe-core "^4.10.0" + axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.19" hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" object.fromentries "^2.0.8" safe-regex-test "^1.0.3" - string.prototype.includes "^2.0.0" + string.prototype.includes "^2.0.1" eslint-plugin-prettier@^5.2.1: version "5.2.1" @@ -5051,26 +5006,26 @@ eslint-plugin-react-hooks@^4.3.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react-hooks@^5.1.0-rc.0: - version "5.1.0-rc-fb9a90fa48-20240614" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz#206a7ec005f0b286aaf7091f4e566083d310b189" - integrity sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w== + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854" + integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw== eslint-plugin-react-refresh@^0.4.9: - version "0.4.14" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.14.tgz#e3c611ead69bbf7436d01295c853d4abb8c59f68" - integrity sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA== + version "0.4.16" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.16.tgz#149dbc9279bd16942409f1c1d2f0dce3299430ef" + integrity sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ== eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.2: - version "7.35.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" - integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== + version "7.37.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" + integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.19" + es-iterator-helpers "^1.1.0" estraverse "^5.3.0" hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" @@ -5107,10 +5062,10 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" - integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -5125,15 +5080,10 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" - integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== - -eslint-visitor-keys@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" - integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== eslint-webpack-plugin@^3.1.1: version "3.2.0" @@ -5147,15 +5097,15 @@ eslint-webpack-plugin@^3.1.1: schema-utils "^4.0.0" eslint@^8.3.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -5191,30 +5141,30 @@ eslint@^8.3.0: text-table "^0.2.0" eslint@^9.9.0: - version "9.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.13.0.tgz#7659014b7dda1ff876ecbd990f726e11c61596e6" - integrity sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA== + version "9.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.16.0.tgz#66832e66258922ac0a626f803a9273e37747f2a6" + integrity sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.11.0" - "@eslint/config-array" "^0.18.0" - "@eslint/core" "^0.7.0" - "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.13.0" - "@eslint/plugin-kit" "^0.2.0" - "@humanfs/node" "^0.16.5" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.9.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.16.0" + "@eslint/plugin-kit" "^0.2.3" + "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.1" + "@humanwhocodes/retry" "^0.4.1" "@types/estree" "^1.0.6" "@types/json-schema" "^7.0.15" ajv "^6.12.4" chalk "^4.0.0" - cross-spawn "^7.0.2" + cross-spawn "^7.0.5" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.1.0" - eslint-visitor-keys "^4.1.0" - espree "^10.2.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -5229,25 +5179,15 @@ eslint@^9.9.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - text-table "^0.2.0" - -espree@^10.0.1: - version "10.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" - integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== - dependencies: - acorn "^8.12.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.0.0" -espree@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" - integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: - acorn "^8.12.0" + acorn "^8.14.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.1.0" + eslint-visitor-keys "^4.2.0" espree@^9.6.0, espree@^9.6.1: version "9.6.1" @@ -5348,36 +5288,36 @@ expect@^27.5.1: jest-message-util "^27.5.1" express@^4.17.3: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.2" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.6.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -5394,7 +5334,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: +fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -5421,9 +5361,9 @@ fast-safe-stringify@^2.0.7: integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== fastq@^1.6.0: version "1.17.1" @@ -5446,31 +5386,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - 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.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - 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 "^1.0.35" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -5512,13 +5427,13 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -5575,22 +5490,14 @@ flat-cache@^4.0.0: keyv "^4.5.4" flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -flux@^4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" - integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== follow-redirects@^1.0.0: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -5600,9 +5507,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -5627,9 +5534,9 @@ fork-ts-checker-webpack-plugin@^6.5.0: tapable "^1.0.0" form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.2.tgz#83ad9ced7c03feaad97e293d6f6091011e1659c8" + integrity sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -5714,16 +5621,19 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz#dfe7dd1b30761b464fe51bf4bb00ac7c37b681e7" + integrity sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg== dependencies: + call-bind-apply-helpers "^1.0.0" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" es-errors "^1.3.0" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" @@ -5826,11 +5736,11 @@ globals@^14.0.0: integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^15.9.0: - version "15.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.11.0.tgz#b96ed4c6998540c6fb824b24b5499216d2438d6e" - integrity sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw== + version "15.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.13.0.tgz#bbec719d69aafef188ecd67954aae76a696010fc" + integrity sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g== -globalthis@^1.0.3: +globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -5850,12 +5760,10 @@ globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.1.0, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" @@ -5884,7 +5792,7 @@ harmony-reflect@^1.4.6: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -has-bigints@^1.0.1, has-bigints@^1.0.2: +has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -5906,15 +5814,17 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.1, has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" @@ -5988,9 +5898,9 @@ html-parse-stringify@^3.0.1: void-elements "3.1.0" html-webpack-plugin@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" - integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + version "5.6.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz#a31145f0fee4184d53a794f9513147df1e653685" + integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -6049,9 +5959,9 @@ http-proxy-agent@^4.0.1: debug "4" http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" + integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -6086,10 +5996,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -i18next@^23.11.5: - version "23.12.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.12.2.tgz#c5b44bb95e4d4a5908a51577fa06c63dc2f650a4" - integrity sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg== +i18next@^24.0.5: + version "24.0.5" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-24.0.5.tgz#2678986eca46411cae0329542a84dd4cd7e5f2f0" + integrity sha512-1jSdEzgFPGLZRsQwydoMFCBBaV+PmrVEO5WhANllZPX4y2JSGTxUjJ+xVklHIsiS95uR8gYc/y0hYZWevucNjg== dependencies: "@babel/runtime" "^7.23.2" @@ -6125,9 +6035,9 @@ identity-obj-proxy@^3.0.0: harmony-reflect "^1.4.6" ignore@^5.2.0, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== immer@^10.0.3: version "10.1.1" @@ -6139,10 +6049,10 @@ immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== -immutable@^4.0.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" - integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== +immutable@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" + integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" @@ -6206,7 +6116,7 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.4, internal-slot@^1.0.7: +internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -6232,15 +6142,7 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: +is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -6260,12 +6162,12 @@ is-async-function@^2.0.0: dependencies: has-tostringtag "^1.0.0" -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: - has-bigints "^1.0.1" + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -6274,23 +6176,23 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.0.tgz#9743641e80a62c094b5941c5bb791d66a88e497a" + integrity sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" - integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== +is-core-module@^2.13.0, is-core-module@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" @@ -6301,7 +6203,7 @@ is-data-view@^1.0.1: dependencies: is-typed-array "^1.1.13" -is-date-object@^1.0.1, is-date-object@^1.0.5: +is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6318,12 +6220,12 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6349,7 +6251,7 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-map@^2.0.2, is-map@^2.0.3: +is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -6364,12 +6266,13 @@ is-negative-zero@^2.0.3: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.0.tgz#5a867e9ecc3d294dda740d9f127835857af7eb05" + integrity sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" @@ -6397,12 +6300,14 @@ is-potential-custom-element-name@^1.0.1: integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.0.tgz#41b9d266e7eb7451312c64efc37e8a7d453077cf" + integrity sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + gopd "^1.1.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-regexp@^1.0.0: version "1.0.0" @@ -6414,7 +6319,7 @@ is-root@^2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-set@^2.0.2, is-set@^2.0.3: +is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== @@ -6431,19 +6336,22 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.0.tgz#8cb83c5d57311bf8058bc6c8db294711641da45d" + integrity sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g== dependencies: - has-tostringtag "^1.0.0" + call-bind "^1.0.7" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.0.tgz#ae993830a56d4781886d39f9f0a46b3e89b7b60b" + integrity sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A== dependencies: - has-symbols "^1.0.2" + call-bind "^1.0.7" + has-symbols "^1.0.3" + safe-regex-test "^1.0.3" is-typed-array@^1.1.13: version "1.1.13" @@ -6541,10 +6449,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== +iterator.prototype@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== dependencies: define-properties "^1.2.1" get-intrinsic "^1.2.1" @@ -7053,7 +6961,7 @@ jest@^27.4.3: import-local "^3.0.2" jest-cli "^27.5.1" -jiti@^1.21.0: +jiti@^1.21.6: version "1.21.6" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== @@ -7111,15 +7019,10 @@ jsdom@^16.6.0: ws "^7.4.6" xml-name-validator "^3.0.0" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jsesc@^3.0.2, jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" @@ -7236,9 +7139,9 @@ language-tags@^1.0.9: language-subtag-registry "^0.3.20" launch-editor@^2.6.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.1.tgz#3bda72af213ec9b46b170e39661916ec66c2f463" - integrity sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA== + version "2.9.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.9.1.tgz#253f173bd441e342d4344b4dae58291abb425047" + integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -7264,15 +7167,15 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@^2.0.3, lilconfig@^2.1.0: +lilconfig@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -lilconfig@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== +lilconfig@^3.0.0, lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" @@ -7320,21 +7223,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -7436,10 +7334,10 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" @@ -7456,10 +7354,10 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" @@ -7497,9 +7395,9 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.4.5: - version "2.9.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" - integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== + version "2.9.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== dependencies: schema-utils "^4.0.0" tapable "^2.2.1" @@ -7552,12 +7450,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7580,9 +7473,9 @@ mz@^2.7.0: thenify-all "^1.0.0" nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== natural-compare-lite@^1.4.0: version "1.4.0" @@ -7599,6 +7492,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -7612,6 +7510,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-fetch-h2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" @@ -7619,7 +7522,7 @@ node-fetch-h2@^2.3.0: dependencies: http2-client "^1.2.5" -node-fetch@^2.6.1, node-fetch@^2.6.12: +node-fetch@^2.6.1: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -7644,9 +7547,9 @@ node-readfiles@^0.2.0: es6-promise "^3.2.1" node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7685,9 +7588,9 @@ nth-check@^2.0.1: boolbase "^1.0.0" nwsapi@^2.2.0: - version "2.2.12" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" - integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== + version "2.2.16" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43" + integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== oas-kit-common@^1.0.8: version "1.0.8" @@ -7735,18 +7638,19 @@ oas-validator@^5.0.8: should "^13.2.1" yaml "^1.10.0" -oazapfts@^4.8.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/oazapfts/-/oazapfts-4.12.0.tgz#8a86c5fe5a1237b16b05d06d05815cffa2a2b949" - integrity sha512-hNKRG4eLYceuJuqDDx7Uqsi8p3j5k83gNKSo2qnUOTiiU03sCQOjXxOqCXDbzRcuDFyK94+1PBIpotK4NoxIjw== +oazapfts@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/oazapfts/-/oazapfts-6.1.0.tgz#f986d5f02ea9a0895b9ed6237ac74a1bf1663721" + integrity sha512-+E0db72jn0AMJ36ZzEXF3qCZ+T4pnOem/tmiJVql1Kx4qkWBE4YGeiUicp3gkzLJ/OrmpvSyAufI8eZ7sODCYg== dependencies: "@apidevtools/swagger-parser" "^10.1.0" lodash "^4.17.21" minimist "^1.2.8" swagger2openapi "^7.0.8" - typescript "^5.2.2" + tapable "^2.2.1" + typescript "^5.4.5" -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -7756,18 +7660,10 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" +object-inspect@^1.13.1, object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== object-keys@^1.1.1: version "1.1.1" @@ -7793,7 +7689,7 @@ object.entries@^1.1.5, object.entries@^1.1.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7, object.fromentries@^2.0.8: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -7816,7 +7712,7 @@ object.getownpropertydescriptors@^2.1.0: gopd "^1.0.1" safe-array-concat "^1.1.2" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -7825,7 +7721,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.1.0, object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: +object.values@^1.1.0, object.values@^1.1.6, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -7947,9 +7843,9 @@ p-try@^2.0.0: integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== param-case@^3.0.4: version "3.0.4" @@ -8027,10 +7923,10 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^4.0.0: version "4.0.0" @@ -8047,15 +7943,10 @@ picocolors@^0.2.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picocolors@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" - integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -8285,7 +8176,7 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-load-config@^4.0.1: +postcss-load-config@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== @@ -8368,20 +8259,20 @@ postcss-modules-extract-imports@^3.1.0: integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== postcss-modules-local-by-default@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" - integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz#b0db6bc81ffc7bdc52eb0f84d6ca0bedf0e36d21" + integrity sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" postcss-modules-scope@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" - integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" @@ -8390,7 +8281,7 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nested@^6.0.1: +postcss-nested@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== @@ -8598,10 +8489,18 @@ postcss-selector-not@^6.0.1: dependencies: postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9, postcss-selector-parser@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz#5be94b277b8955904476a2400260002ce6c56e38" - integrity sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz#41bd8b56f177c093ca49435f65731befe25d6b9c" + integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8634,22 +8533,13 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.4: - version "8.4.41" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" - integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - -postcss@^8.4.43: - version "8.4.47" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" - integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== +postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47, postcss@^8.4.49: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" - picocolors "^1.1.0" + picocolors "^1.1.1" source-map-js "^1.2.1" prelude-ls@^1.2.1: @@ -8669,15 +8559,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.2.1: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -prettier@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +prettier@^3.2.5, prettier@^3.3.3: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" @@ -8716,13 +8601,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - promise@^8.1.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -8764,31 +8642,28 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" querystringify@^2.1.1: version "2.2.0" @@ -8841,24 +8716,14 @@ react-app-polyfill@^3.0.0: regenerator-runtime "^0.13.9" whatwg-fetch "^3.6.2" -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - react-bootstrap@^2.10.2: - version "2.10.4" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.4.tgz#ed92f5f8225a44919a7707829bac879558b71b70" - integrity sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q== + version "2.10.6" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.6.tgz#cb8b6f3604480b99b1e3cfa09cf53446e760bba7" + integrity sha512-fNvKytSp0nHts1WRnRBJeBEt+I9/ZdrnhIjWOucEduRNvFRU1IXjZueDdWnBiqsTSJ7MckQJi9i/hxGolaRq+g== dependencies: "@babel/runtime" "^7.24.7" "@restart/hooks" "^0.4.9" - "@restart/ui" "^1.6.9" + "@restart/ui" "^1.9.0" "@types/react-transition-group" "^4.4.6" classnames "^2.3.2" dom-helpers "^5.2.1" @@ -8920,11 +8785,11 @@ react-error-overlay@^6.0.11: integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== react-i18next@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.0.0.tgz#4980f8edf85b9df6573d6b12d95aca5b8f0cc8b0" - integrity sha512-2O3IgF4zivg57Q6p6i+ChDgJ371IDcEWbuWC6gvoh5NbkDMs0Q+O7RPr4v61+Se32E0V+LmtwePAeqWZW0bi6g== + version "15.1.4" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.1.4.tgz#65c03c31a5e42202000652e163f22f23a9306a60" + integrity sha512-2tai71gmehbvl9ZIqPMqlCCkm/cbeV1G4STpmM3C8Uzo6T2l8jDvZxEVSsQKt8blP9X34iRFP/k1ROqG2296MQ== dependencies: - "@babel/runtime" "^7.24.8" + "@babel/runtime" "^7.25.0" html-parse-stringify "^3.0.1" react-is@^16.13.1, react-is@^16.3.2: @@ -8942,28 +8807,18 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-redux@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" - integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== + version "9.2.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.2.0.tgz#96c3ab23fb9a3af2cb4654be4b51c989e32366f5" + integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g== dependencies: - "@types/use-sync-external-store" "^0.0.3" - use-sync-external-store "^1.0.0" + "@types/use-sync-external-store" "^0.0.6" + use-sync-external-store "^1.4.0" react-refresh@^0.11.0: version "0.11.0" @@ -8976,19 +8831,19 @@ react-refresh@^0.14.2: integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== react-router-dom@^6.23.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.0.tgz#8debe13295c58605c04f93018d659a763245e58c" - integrity sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ== + version "6.28.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.28.0.tgz#f73ebb3490e59ac9f299377062ad1d10a9f579e6" + integrity sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg== dependencies: - "@remix-run/router" "1.19.0" - react-router "6.26.0" + "@remix-run/router" "1.21.0" + react-router "6.28.0" -react-router@6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.0.tgz#d5af4c46835b202348ef2b7ddacd32a2db539fde" - integrity sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg== +react-router@6.28.0: + version "6.28.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.28.0.tgz#29247c86d7ba901d7e5a13aa79a96723c3e59d0d" + integrity sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg== dependencies: - "@remix-run/router" "1.19.0" + "@remix-run/router" "1.21.0" react-scripts@5.0.1: version "5.0.1" @@ -9045,19 +8900,10 @@ react-scripts@5.0.1: optionalDependencies: fsevents "^2.3.2" -react-textarea-autosize@^8.3.2: - version "8.5.4" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.4.tgz#1c568ad838857b6ce86ee2a96e504179305e0bf4" - integrity sha512-eSSjVtRLcLfFwFcariT77t9hcbVJHQV76b51QjQGarQIHml2+gM2lms0n3XrhnDmgK5B+/Z7TmQk5OHNzqYm/A== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - react-toastify@^10.0.5: - version "10.0.5" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-10.0.5.tgz#6b8f8386060c5c856239f3036d1e76874ce3bd1e" - integrity sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw== + version "10.0.6" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-10.0.6.tgz#19c364b1150f495522c738d592d1dcc93879ade1" + integrity sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A== dependencies: clsx "^2.1.0" @@ -9107,6 +8953,11 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9149,28 +9000,29 @@ redux@^5.0.1: resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== +reflect.getprototypeof@^1.0.4, reflect.getprototypeof@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz#c58afb17a4007b4d1118c07b92c23fca422c5d82" + integrity sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" define-properties "^1.2.1" - es-abstract "^1.23.1" + dunder-proto "^1.0.0" + es-abstract "^1.23.5" es-errors "^1.3.0" get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" + gopd "^1.2.0" + which-builtin-type "^1.2.0" reftools@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== -regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" @@ -9201,34 +9053,39 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== +regexp.prototype.flags@^1.5.2, regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + set-function-name "^2.0.2" -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: - "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" 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.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: - jsesc "~0.5.0" + jsesc "~3.0.2" relateurl@^0.2.7: version "0.2.7" @@ -9299,7 +9156,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.22.8: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -9355,35 +9212,38 @@ rollup-plugin-visualizer@^5.11.0: yargs "^17.5.1" rollup@^2.43.1: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + version "2.79.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.2.tgz#f150e4a5db4b121a21a747d762f701e5e9f49090" + integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== optionalDependencies: fsevents "~2.3.2" -rollup@^4.20.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.0.tgz#c14a3576f20622ea6a5c9cad7caca5e6e9555d05" - integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg== +rollup@^4.23.0: + version "4.28.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.1.tgz#7718ba34d62b449dfc49adbfd2f312b4fe0df4de" + integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.24.0" - "@rollup/rollup-android-arm64" "4.24.0" - "@rollup/rollup-darwin-arm64" "4.24.0" - "@rollup/rollup-darwin-x64" "4.24.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.24.0" - "@rollup/rollup-linux-arm-musleabihf" "4.24.0" - "@rollup/rollup-linux-arm64-gnu" "4.24.0" - "@rollup/rollup-linux-arm64-musl" "4.24.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.24.0" - "@rollup/rollup-linux-riscv64-gnu" "4.24.0" - "@rollup/rollup-linux-s390x-gnu" "4.24.0" - "@rollup/rollup-linux-x64-gnu" "4.24.0" - "@rollup/rollup-linux-x64-musl" "4.24.0" - "@rollup/rollup-win32-arm64-msvc" "4.24.0" - "@rollup/rollup-win32-ia32-msvc" "4.24.0" - "@rollup/rollup-win32-x64-msvc" "4.24.0" + "@rollup/rollup-android-arm-eabi" "4.28.1" + "@rollup/rollup-android-arm64" "4.28.1" + "@rollup/rollup-darwin-arm64" "4.28.1" + "@rollup/rollup-darwin-x64" "4.28.1" + "@rollup/rollup-freebsd-arm64" "4.28.1" + "@rollup/rollup-freebsd-x64" "4.28.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.28.1" + "@rollup/rollup-linux-arm-musleabihf" "4.28.1" + "@rollup/rollup-linux-arm64-gnu" "4.28.1" + "@rollup/rollup-linux-arm64-musl" "4.28.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.28.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1" + "@rollup/rollup-linux-riscv64-gnu" "4.28.1" + "@rollup/rollup-linux-s390x-gnu" "4.28.1" + "@rollup/rollup-linux-x64-gnu" "4.28.1" + "@rollup/rollup-linux-x64-musl" "4.28.1" + "@rollup/rollup-win32-arm64-msvc" "4.28.1" + "@rollup/rollup-win32-ia32-msvc" "4.28.1" + "@rollup/rollup-win32-x64-msvc" "4.28.1" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -9410,16 +9270,16 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -9439,139 +9299,140 @@ sanitize.css@*: resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== -sass-embedded-android-arm64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.80.6.tgz#748df1f7deabea3a81c2c647661d9696090e1b81" - integrity sha512-4rC4ZGM/k4ENVjLXnK3JTst8e8FI9MHSol2Fl7dCdYyJ3KLnlt4qL4AEYfU8zq1tcBb7CBOSZVR+CzCKubnXdg== - -sass-embedded-android-arm@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.80.6.tgz#1fa2e08e5b2a77709f6e8cb8186c801ee140c0a9" - integrity sha512-UeUKMTRsnz4/dh7IzvhjONxa4/jmVp539CHDd8VZOsqg9M3HcNJNIkUzQWbuwZ+nSlWrTuo7Tvn3XlypopCBzw== - -sass-embedded-android-ia32@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.80.6.tgz#43674c98454a3adb5da3cca0ba23340128bfbdff" - integrity sha512-Lxz2SXE2KdHnynuHF+D6flDvrd55/zaEAWUeka9MxEr6FmR66d8UBOIy5ETwCSUd//S/SE5Jl6oTnHppgD1zNA== - -sass-embedded-android-riscv64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.80.6.tgz#59c9d53b1c800b53221d56cf55d9cf84b4418bac" - integrity sha512-hKdxY/oOqB+JJhSoBTDM5DJO1j/xtxQgayh2cLCCUx37IQQe3SEdc3V2JFf/4mIo5peaS4cjqwwSATF+l2zaXg== - -sass-embedded-android-x64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.80.6.tgz#a06a9f55f904c3ba628a3ae03c244f134f4f2bb1" - integrity sha512-Eap2Fi3kTx/rVLBsOnOp5RYPr5+lFjTZ652zR24dmYFe9/sDgasakJIOPjOvD2bRuL9z0uWEY1AXVeeOPeZKrg== - -sass-embedded-darwin-arm64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.80.6.tgz#81a7019c92a8c8f76f7f98dfe15f6adfaf621e92" - integrity sha512-0mnAx8Vq6Gxj3PQt3imgITfK33hhqrSKpyHSuab71gZZni5opsdtoggq2JawW+1taRFTEZwbZJLKZ0MBDbwCCA== - -sass-embedded-darwin-x64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.80.6.tgz#d1b551443930658bfa4cc92ca026d4b22023ce9d" - integrity sha512-Ib20yNZFOrJ7YVT+ltoe+JQNKPcRclM3iLAK69XZZYcSeFM/72SCoQBAaVGIpT23dxDp7FXiE4lO602c3xTRwQ== - -sass-embedded-linux-arm64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.80.6.tgz#fe6255bbbe55590fb6405f098431b3841221a1b0" - integrity sha512-n5r98pBXawrQQKaxIYCMM1zDpnngsqxTkOrmvsYLFiAMCSbR0lWf/7sBB33k/Pm0D6dsbp3jpHilCoQNKI3jIw== - -sass-embedded-linux-arm@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.80.6.tgz#a6603b1ec087762a1128e836fd36851050b537b4" - integrity sha512-QR0Q6TZox/ThuU2r9c0s3fKCgU2rXAEocpitdgxFp6tta+GsQlMFV3oON2unAa8Bwnuxkmf0YOaK0Oy/TwzkXw== - -sass-embedded-linux-ia32@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.80.6.tgz#bedb53348f7e384ceabc9e0158b086045779af07" - integrity sha512-O6dWZdcOkryRdDCxVMGOeVowgblpDgVcAuRtZ1F1X7XfbpDriTQm64D+9vVZIrywYSPoJfQMJJ662cr0wUs9IQ== - -sass-embedded-linux-musl-arm64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.80.6.tgz#0f0e0bb68c90f0ae920d9a06760241f3f58c7a76" - integrity sha512-VeUSHUi3MAsvOlg9QI4X/2j04h1659aE+7qKP/282CYBTrGkjFGSXZhIki9WKWDgIpDiSInRYXfQQRWhPhjCDg== - -sass-embedded-linux-musl-arm@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.80.6.tgz#41039f857684ee3470ec9e0d310add5f6f1b694d" - integrity sha512-X9FC8s8fvQGRiXc+eATlZ57N44Iq3nNa0M0ugi3ysdJwkaNYvOeS4QzBHKQAaw3QiTqdxTnLUHHVBkyzdCi9pw== - -sass-embedded-linux-musl-ia32@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.80.6.tgz#8ff88c78ba3503a19d59c5b8fa172fdea00a67f8" - integrity sha512-GqitS2Nab8ah0+wfCqaxW1hnI1piC08FimL6+lM9YWK5DbCOOF82IapbvJOy0feUmd/wNnHmyNTgE9h0zVMFdQ== - -sass-embedded-linux-musl-riscv64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.80.6.tgz#aaa086a6ce9718d0fd7cbe584c0f2bf81bef3122" - integrity sha512-ySs15z7QSRRQK/aByEEqaJLYW/sTpfynefNPZCtsVNVEzNRwy+DRpxNChtxo+QjKq97ocXETbdG5KLik7QOTJg== - -sass-embedded-linux-musl-x64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.6.tgz#ea0bb093837be3b6f473b9a1b5d09c4633f8e504" - integrity sha512-DzeNqU/SN0mWFznoOH4RtVGcrg3Eoa41pUQhKMtrhNbCmIE1zNDunUiAEVTNpdHJF4nxf7ELUPXWmStM31CbUQ== - -sass-embedded-linux-riscv64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.80.6.tgz#bc19c15796a3b3a3d67ea626058b3bab48344b1d" - integrity sha512-AyoHJ3icV9xuJjq1YzJqpEj2XfiC/KBkVYTUrCELKiXP0DN1gi/BpUwZNCAgCM3CyEdMef4LQM/ztCYJxYzdyg== - -sass-embedded-linux-x64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.6.tgz#db076fdf0bc3c1382c8f73c8d396293b893b31ef" - integrity sha512-EohsE9CEqx0ycylnsEj/0DNPG99Tb0qAVZspiAs5xHFCJjXOFfp3cRQu0BRf+lZ1b72IhPFXymzVtojvzUHb7g== - -sass-embedded-win32-arm64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.80.6.tgz#e889c421b0b31e1297414dd89448385fe443d5e2" - integrity sha512-29wETQi1ykeVvpd4zMVokpQKFSOZskGJzZawuuNCdo7BHjHKIRDsqbz8YT1CewHPBshI0hfD21fenmjxYjGXPQ== - -sass-embedded-win32-ia32@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.80.6.tgz#0934f3598e4fbe701b5e4e4d2a1fa6ef952f7024" - integrity sha512-1s3OpK2iTIfIL/a91QhAQnffsbuWfnsM8Lx4Fxt0f7ErnxjCV6q8MUFTV/UhcLtLyTFnPCA62DLjp2KGCjMI9A== - -sass-embedded-win32-x64@1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.80.6.tgz#b7357b399c12cbb80dab2bee6f541b88a6015d76" - integrity sha512-0pH4Zr9silHkcmLPC0ghnD3DI0vMsjA7dKvGR32/RbbjOSvHV5cDQRLiuVJAPp34dfMA7kJd1ysSchRdH0igAQ== +sass-embedded-android-arm64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.82.0.tgz#f67352258d52c655dcfa9ca444d0cdcc2d5a9232" + integrity sha512-bldHMs02QQWXsgHUZRgolNnZdMjN6XHvmUYoRkzmFq7lsvtLU6SJg2S1Wa9IZJs9jRWdTmOgA6YibSf3pROyFQ== + +sass-embedded-android-arm@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.82.0.tgz#9600c0c980f08be2b8bcd765d78bdd765d776ab9" + integrity sha512-ttGMvWnA/5TYdZTjr5fWHDbb9nZgKipHKCc9zZQRF5HjUydOYWKNqmAJHQtbFWaq35kd5qn6yiE73IJN6eJ6wA== + +sass-embedded-android-ia32@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.82.0.tgz#448f7f39f3d8fb4d759ba9ab54b94be9904c3c10" + integrity sha512-FUJOnxw8IYKuYuxxiOkk6QXle8/yQFtKjnuSAJuZ5ZpLVMcSZzLc3SWOtuEXYx5iSAfJCO075o2ZoG/pPrJ9aw== + +sass-embedded-android-riscv64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.82.0.tgz#20a8a890bd0cba3487d67d2ab7059c30694c68ad" + integrity sha512-rd+vc+sxJxNnbhaubiIJmnb1b3FvC9wxCIq8spstopbO7o1uufvBBDeRoFSJaN+7oNhamzjlYGdu6aQoQNs3+A== + +sass-embedded-android-x64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.82.0.tgz#e56065192cd68d4e14634e84f230a2f1ab7cfad6" + integrity sha512-EVlybGTgJ8wNLyWj8RUatPXSnmIcvCsx3EfsRfBfhGihLbn4NNpavYO9QsvZzI2XWbJqHLBCd+CvkTcDw/TaSQ== + +sass-embedded-darwin-arm64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.82.0.tgz#50c1f2fa71294b7fccfc7998d31bd52ebf72fd2c" + integrity sha512-LvdJPojjKlNGYOB0nSUR/ZtMDuAF4puspHlwK42aA/qK292bfSkMUKZPPapB2aSRwccc/ieBq5fI7n/WHrOCVw== + +sass-embedded-darwin-x64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.82.0.tgz#8251268ec519472415918e04ed8501a0c1491547" + integrity sha512-6LfnD6YmG1aBfd3ReqMOJDb6Pg2Z/hmlJB7nU+Lb3E+hCNjAZAgeUHQxU/Pm1eIqJJTU/h4ib5QP0Pt9O8yVnw== + +sass-embedded-linux-arm64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.82.0.tgz#149d8620d5d371feb32abec6e7e917805209baf1" + integrity sha512-590/y0HJr/JiyxaqgR7Xf9P20BIhJ+zhB/afAnVuZe/4lEfCpTyM5xMe2+sKLsqtrVyzs9Zm/M4S4ASUOPCggA== + +sass-embedded-linux-arm@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.82.0.tgz#c48a57c3e00050bb16a3195f10f5b863e856c777" + integrity sha512-ozjdC5rWzyi5Vo300I4tVZzneXOTQUiaxOr7DjtN26HuFaGAGCGmvThh2BRV4RvySg++5H9rdFu+VgyUQ5iukw== + +sass-embedded-linux-ia32@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.82.0.tgz#a4ff182f47b703d953364751073a1e576823a168" + integrity sha512-hpc4acZ3UTjjJ3Q/GUXqQOCSml6AFKaku0HMawra9bKyRmOpxn8V5hqgXeOWVjK2oQzCmCnJvwKoQUP+S/SIYQ== + +sass-embedded-linux-musl-arm64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.82.0.tgz#fed3baf77431637d97d50db63630aa13e5324594" + integrity sha512-bc2MUSMv/jabnNGEyKP2jQAYZoEzTT/c633W6QoeSEWETGCuTNjaHvWWE6qSI6/UfRg1EpuV1LQA2jPMzZfv/w== + +sass-embedded-linux-musl-arm@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.82.0.tgz#5799eb6de083a08f47a4eb925ff2c7b70ed65656" + integrity sha512-R5PQmY/I+GSoMtfLo8GgHkvF/q6x6y8VNM7yu/Ac1mJj86n48VFi29W1HfY2496+Q6cpAq7toobDj7YfldIdVA== + +sass-embedded-linux-musl-ia32@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.82.0.tgz#39a3f41d95c47610c9f9ea3d19ab5894dcd2b9cf" + integrity sha512-ZQKCFKm5TBcJ19UG6uUQmIKfVCJIWMb7e1a93lGeujSb9gyKF5Fb6MN3tuExoT7iFK8zU0Z9iyHqh93F58lcCw== + +sass-embedded-linux-musl-riscv64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.82.0.tgz#337c57a8b4320e1b5c05f4864fa89824c052164a" + integrity sha512-5meSU8BHFeaT09RWfkuUrikRlC+WZcYb9To7MpfV1d9nlD7CZ2xydPExK+mj3DqRuQvTbvhMPcr7f+pHlgHINQ== + +sass-embedded-linux-musl-x64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.82.0.tgz#2a24459f8d41e53773d07cec80b4ac36de98f598" + integrity sha512-ASLAMfjWv7YEPBvEOVlb3zzHq8l4Y9Eh4x3m7B1dNauGVbO11Yng5cPCX/XbwGVf30BtE75pwqvV7oXxBtN15w== + +sass-embedded-linux-riscv64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.82.0.tgz#623a30b4c2a0eccacb2bcfe3864289c8be34d80c" + integrity sha512-qWvRDXCXH3GzD8OcP0ntd8gBTK3kZyUeyXmxQDZyEtMAM4STC2Tn7+5+2JYYHlppzqWnZPFBNESvpKeOtHaBBw== + +sass-embedded-linux-x64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.82.0.tgz#e119374e0ecb3675515c49bac782c34f8a12dd60" + integrity sha512-AmRaHqShztwfep+M4NagdGaY7fTyWGSOM3k4Z/dd7q4nZclXbALLqNJtKx8xOM7A41LHYJ9zDpIBVRkrh0PzTA== + +sass-embedded-win32-arm64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.82.0.tgz#d1db895b7314412c14542aee7a794ed5cad2e116" + integrity sha512-zL9JDQZHXHSGAZe5DqSrR86wMHbm9QPziU4/3hoIG+99StuS74CuV42+hw/+FXXBkXMWbjKWsyF/HZt+I/wJuw== + +sass-embedded-win32-ia32@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.82.0.tgz#55cab8c42d9df4853cd35354055326f00b963dae" + integrity sha512-xE+AzLquCkFPnnpo0NHjQdLRIhG1bVs42xIKx42aUbVLYKkBDvbBGpw6EtTscRMyvcjoOqGH5saRvSFComUQcw== + +sass-embedded-win32-x64@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.82.0.tgz#b95082047a18346452ee19a2dd92c2d6abab466c" + integrity sha512-cEgfOQG5womOzzk16ReTv2dxPq5BG16LgLUold/LH9IZH86u4E/MN7Fspf4RWeEJ2EcLdew9QYSC2YWs1l98dQ== sass-embedded@^1.80.6: - version "1.80.6" - resolved "https://registry.yarnpkg.com/sass-embedded/-/sass-embedded-1.80.6.tgz#efd66c12c7f117c2dcb558e8bf6bd00cc5cd49b2" - integrity sha512-Og4aqBnaA3oJfIpHaLuNATAqzBRgUJDYJy2X15V59cot2wYOtiT/ciPnyuq1o7vpDEeOkHhEd+mSviSlXoETug== + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass-embedded/-/sass-embedded-1.82.0.tgz#2fe1f592840458d08c0b6d4893f8af6cdad7b379" + integrity sha512-v13sRVVZtWAQLpAGTz5D8hy+oyNKRHao5tKVc/P6AMqSP+jDM8X6GkEpL0jfbu3MaN2/hAQsd4Qx14GG1u0prQ== dependencies: "@bufbuild/protobuf" "^2.0.0" buffer-builder "^0.2.0" colorjs.io "^0.5.0" - immutable "^4.0.0" + immutable "^5.0.2" rxjs "^7.4.0" supports-color "^8.1.1" + sync-child-process "^1.0.2" varint "^6.0.0" optionalDependencies: - sass-embedded-android-arm "1.80.6" - sass-embedded-android-arm64 "1.80.6" - sass-embedded-android-ia32 "1.80.6" - sass-embedded-android-riscv64 "1.80.6" - sass-embedded-android-x64 "1.80.6" - sass-embedded-darwin-arm64 "1.80.6" - sass-embedded-darwin-x64 "1.80.6" - sass-embedded-linux-arm "1.80.6" - sass-embedded-linux-arm64 "1.80.6" - sass-embedded-linux-ia32 "1.80.6" - sass-embedded-linux-musl-arm "1.80.6" - sass-embedded-linux-musl-arm64 "1.80.6" - sass-embedded-linux-musl-ia32 "1.80.6" - sass-embedded-linux-musl-riscv64 "1.80.6" - sass-embedded-linux-musl-x64 "1.80.6" - sass-embedded-linux-riscv64 "1.80.6" - sass-embedded-linux-x64 "1.80.6" - sass-embedded-win32-arm64 "1.80.6" - sass-embedded-win32-ia32 "1.80.6" - sass-embedded-win32-x64 "1.80.6" + sass-embedded-android-arm "1.82.0" + sass-embedded-android-arm64 "1.82.0" + sass-embedded-android-ia32 "1.82.0" + sass-embedded-android-riscv64 "1.82.0" + sass-embedded-android-x64 "1.82.0" + sass-embedded-darwin-arm64 "1.82.0" + sass-embedded-darwin-x64 "1.82.0" + sass-embedded-linux-arm "1.82.0" + sass-embedded-linux-arm64 "1.82.0" + sass-embedded-linux-ia32 "1.82.0" + sass-embedded-linux-musl-arm "1.82.0" + sass-embedded-linux-musl-arm64 "1.82.0" + sass-embedded-linux-musl-ia32 "1.82.0" + sass-embedded-linux-musl-riscv64 "1.82.0" + sass-embedded-linux-musl-x64 "1.82.0" + sass-embedded-linux-riscv64 "1.82.0" + sass-embedded-linux-x64 "1.82.0" + sass-embedded-win32-arm64 "1.82.0" + sass-embedded-win32-ia32 "1.82.0" + sass-embedded-win32-x64 "1.82.0" sass-loader@^12.3.0: version "12.6.0" @@ -9581,14 +9442,16 @@ sass-loader@^12.3.0: klona "^2.0.4" neo-async "^2.6.2" -sass@1.77.6: - version "1.77.6" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" - integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== +sass@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70" + integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q== dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" + chokidar "^4.0.0" + immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" sax@~1.2.4: version "1.2.4" @@ -9669,10 +9532,10 @@ semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semve resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -9715,17 +9578,17 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -9747,11 +9610,6 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -9775,9 +9633,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.7.3, shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== should-equal@^2.0.0: version "2.0.0" @@ -9872,12 +9730,7 @@ source-list-map@^2.0.0, source-list-map@^2.0.1: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map-js@^1.2.1: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -9983,13 +9836,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -10038,13 +9884,14 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.includes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" - integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== +string.prototype.includes@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" + integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: version "4.0.11" @@ -10189,7 +10036,7 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" -sucrase@^3.32.0: +sucrase@^3.35.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== @@ -10295,41 +10142,53 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +sync-child-process@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/sync-child-process/-/sync-child-process-1.0.2.tgz#45e7c72e756d1243e80b547ea2e17957ab9e367f" + integrity sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA== + dependencies: + sync-message-port "^1.0.0" + +sync-message-port@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sync-message-port/-/sync-message-port-1.1.3.tgz#6055c565ee8c81d2f9ee5aae7db757e6d9088c0c" + integrity sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg== + synckit@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" - integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" tailwindcss@^3.0.2: - version "3.4.7" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.7.tgz#6092f18767f5933f59375b9afe558e592fc77201" - integrity sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ== + version "3.4.16" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.16.tgz#35a7c3030844d6000fc271878db4096b6a8d2ec9" + integrity sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" - chokidar "^3.5.3" + chokidar "^3.6.0" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.3.0" + fast-glob "^3.3.2" glob-parent "^6.0.2" is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" + jiti "^1.21.6" + lilconfig "^3.1.3" + micromatch "^4.0.8" normalize-path "^3.0.0" object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" + picocolors "^1.1.1" + postcss "^8.4.47" 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" - resolve "^1.22.2" - sucrase "^3.32.0" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" tapable@^1.0.0: version "1.1.3" @@ -10376,9 +10235,9 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.31.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.3.tgz#b24b7beb46062f4653f049eea4f0cd165d0f0c38" - integrity sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA== + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10433,11 +10292,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -10485,9 +10339,9 @@ tryer@^1.0.1: integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-interface-checker@^0.1.9: version "0.1.13" @@ -10509,12 +10363,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -tslib@^2.1.0: +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.6.2, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -10589,9 +10438,9 @@ typed-array-byte-length@^1.0.1: is-typed-array "^1.1.13" typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -10599,18 +10448,19 @@ typed-array-byte-offset@^1.0.2: gopd "^1.0.1" has-proto "^1.0.3" is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -10620,28 +10470,18 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript-eslint@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.12.0.tgz#507f227097836a8b679108d2a80a3e9f20c5e74a" - integrity sha512-m8aQM4pqc17dcD3BsQzUqVXkcclCspuCCv7GhYlwMWNYAXFV8xJkn8vUM8YxoR78BY6S+NX/J7rfNVaGNLgXgQ== + version "8.18.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.18.0.tgz#41026f27a3481185f3239d817ae5b960572145a0" + integrity sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ== dependencies: - "@typescript-eslint/eslint-plugin" "8.12.0" - "@typescript-eslint/parser" "8.12.0" - "@typescript-eslint/utils" "8.12.0" - -typescript@^5.0.0, typescript@^5.2.2: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== - -typescript@^5.5.3: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + "@typescript-eslint/eslint-plugin" "8.18.0" + "@typescript-eslint/parser" "8.18.0" + "@typescript-eslint/utils" "8.18.0" -ua-parser-js@^1.0.35: - version "1.0.39" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" - integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw== +typescript@^5.4.5, typescript@^5.5.3, typescript@^5.5.4: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== unbox-primitive@^1.0.2: version "1.0.2" @@ -10663,7 +10503,7 @@ uncontrollable@^7.2.1: invariant "^2.2.4" react-lifecycles-compat "^3.0.4" -uncontrollable@^8.0.1: +uncontrollable@^8.0.4: version "8.0.4" resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== @@ -10673,15 +10513,15 @@ underscore@1.12.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== -undici-types@~6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.13.0.tgz#e3e79220ab8c81ed1496b5812471afd7cf075ea5" - integrity sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" @@ -10692,9 +10532,9 @@ unicode-match-property-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.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" @@ -10733,13 +10573,13 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2: version "4.4.1" @@ -10756,27 +10596,10 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -use-sync-external-store@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" - integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== +use-sync-external-store@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -10837,14 +10660,14 @@ vite-bundle-visualizer@^1.2.1: rollup-plugin-visualizer "^5.11.0" tmp "^0.2.1" -vite@^5.4.9: - version "5.4.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.9.tgz#215c80cbebfd09ccbb9ceb8c0621391c9abdc19c" - integrity sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg== +vite@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.3.tgz#cc01f403e326a9fc1e064235df8a6de084c8a491" + integrity sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw== dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" + esbuild "^0.24.0" + postcss "^8.4.49" + rollup "^4.23.0" optionalDependencies: fsevents "~2.3.3" @@ -10882,9 +10705,9 @@ warning@^4.0.0, warning@^4.0.3: loose-envify "^1.0.0" watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -10897,9 +10720,9 @@ wbuf@^1.1.0, wbuf@^1.7.3: minimalistic-assert "^1.0.0" web-vitals@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.2.tgz#e883245180b95e175eb75a5ca8903b1a11597d7a" - integrity sha512-nYfoOqb4EmElljyXU2qdeE76KsvoHdftQKY4DzA9Aw8DervCg2bG634pHLrJ/d6+B4mE3nWTSJv8Mo7B2mbZkw== + version "4.2.4" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.4.tgz#1d20bc8590a37769bd0902b289550936069184b7" + integrity sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw== webidl-conversions@^3.0.0: version "3.0.1" @@ -10998,20 +10821,19 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.93.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5" - integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" + version "5.97.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58" + integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.0" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -11085,26 +10907,27 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: webidl-conversions "^6.1.0" which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz#2d850d6c4ac37b95441a67890e19f3fda8b6c6d9" + integrity sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng== 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" + is-bigint "^1.1.0" + is-boolean-object "^1.2.0" + is-number-object "^1.1.0" + is-string "^1.1.0" + is-symbol "^1.1.0" -which-builtin-type@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" - integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== +which-builtin-type@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c" + integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== dependencies: + call-bind "^1.0.7" function.prototype.name "^1.1.6" has-tostringtag "^1.0.2" is-async-function "^2.0.0" is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" + is-finalizationregistry "^1.1.0" is-generator-function "^1.0.10" is-regex "^1.1.4" is-weakref "^1.0.2" @@ -11113,7 +10936,7 @@ which-builtin-type@^1.1.3: which-collection "^1.0.2" which-typed-array "^1.1.15" -which-collection@^1.0.1, which-collection@^1.0.2: +which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -11123,10 +10946,10 @@ which-collection@^1.0.1, which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.16" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.16.tgz#db4db429c4706feca2f01677a144278e4a8c216b" + integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -11400,9 +11223,9 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" - integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== + version "2.6.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" + integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== yargs-parser@^20.2.2: version "20.2.9" -- GitLab From efd7f81a86e27e45a28f7f3b3ae1d21717171600 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 11 Dec 2024 00:37:35 +0100 Subject: [PATCH 42/78] ui: fix linting issues --- react-ui/src/components/devices/index.module.ts | 5 ----- react-ui/src/components/login/view/login.view.tsx | 10 +++++----- .../json_viewer/reducer/json_viewer.reducer.ts | 2 +- .../json_viewer/viewmodel/json_viewer.viewmodel.tsx | 4 ++-- .../layouts/protected.layout/protected.layout.tsx | 2 +- react-ui/src/shared/provider/auth.provider.tsx | 2 +- react-ui/src/shared/provider/menu/menu.provider.tsx | 4 ++-- react-ui/src/shared/provider/utils.provider.tsx | 4 ++-- react-ui/src/shared/reducer/routine.reducer.ts | 13 +++++++++---- 9 files changed, 23 insertions(+), 23 deletions(-) delete mode 100755 react-ui/src/components/devices/index.module.ts diff --git a/react-ui/src/components/devices/index.module.ts b/react-ui/src/components/devices/index.module.ts deleted file mode 100755 index 5ef9299bd..000000000 --- a/react-ui/src/components/devices/index.module.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { fetchSelectedMneThunk } from './routines/mne.routine' - -const routines = { - fetchSelectedMneThunk: fetchSelectedMneThunk, -} diff --git a/react-ui/src/components/login/view/login.view.tsx b/react-ui/src/components/login/view/login.view.tsx index e393bb4b3..03d7406f4 100755 --- a/react-ui/src/components/login/view/login.view.tsx +++ b/react-ui/src/components/login/view/login.view.tsx @@ -1,12 +1,12 @@ -import { Alert, Button, Col, Container, Form, Image, Row, Spinner } from 'react-bootstrap' -import { useTranslation } from 'react-i18next' -import './login.scss' - import logo from '@assets/logo.svg' +import { BasicProp } from '@helper/interfaces' import React, { useRef } from 'react' +import { Alert, Button, Col, Container, Form, Image, Row, Spinner } from 'react-bootstrap' +import { useTranslation } from 'react-i18next' import useLoginViewModel from '../viewmodel/login.viewmodel' +import './login.scss' -const LoginView = ({ children }) => { +const LoginView: React.FC<BasicProp> = () => { const { t } = useTranslation('common') const { login, handleErrorMessageRendering, displayFormFieldChecks, loginLoading } = useLoginViewModel(); diff --git a/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts index 0779d0e18..dd432535c 100755 --- a/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts +++ b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts @@ -55,7 +55,7 @@ const JsonViewerSlice = createSlice({ const { identifier, collapse } = payload // potentially find already collapsed - let i = state.collapseContainer.findIndex(i => compareIdentifier(identifier, i.identifier)) + const i = state.collapseContainer.findIndex(i => compareIdentifier(identifier, i.identifier)) if (i === -1) { diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index a1a9c8977..da78528f2 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -54,7 +54,7 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy return !!item.length; } - const collapse = (key: string, nested: number, json: Object, collapseState: CollapseValues = CollapseValues.TOGGLE) => { + const collapse = (key: string, nested: number, json: object, collapseState: CollapseValues = CollapseValues.TOGGLE) => { const identifier = { key, nested }; dispatch(toggleCollapse({ identifier, collapse: collapseState })) @@ -95,7 +95,7 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy } } - const innerSearch = (json: Object, searchValue: string, parentKey: string = "", path: string = "/"): boolean => { + const innerSearch = (json: object, searchValue: string, parentKey: string = "", path: string = "/"): boolean => { let found = false; path += parentKey + (parentKey === "" ? "" : "/") diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 0708d87f1..c7e13c6fe 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -29,7 +29,7 @@ export const ProtectedLayout = () => { dispatch(fetchUser()); dispatch(fetchPnds()); - }, []); + }, [dispatch]); /** * Applies active css class to link if the link is active diff --git a/react-ui/src/shared/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx index 830a4d47d..69bdccbdf 100755 --- a/react-ui/src/shared/provider/auth.provider.tsx +++ b/react-ui/src/shared/provider/auth.provider.tsx @@ -103,7 +103,7 @@ export const AuthProvider: React.FC<BasicProp> = ({ children }) => { isAuthenticated, loginProperties }), - [] + [executeLogin, loginProperties, logout] ); return ( diff --git a/react-ui/src/shared/provider/menu/menu.provider.tsx b/react-ui/src/shared/provider/menu/menu.provider.tsx index 0cfc61f68..a91f46639 100644 --- a/react-ui/src/shared/provider/menu/menu.provider.tsx +++ b/react-ui/src/shared/provider/menu/menu.provider.tsx @@ -23,7 +23,7 @@ interface MenuProviderType { } const MenuContext = createContext<MenuProviderType>({ - subscribe: function (value: SubscriptionValue): MenuSubscription { + subscribe: function (): MenuSubscription { throw new Error("Function not implemented."); } }) @@ -86,7 +86,7 @@ export const MenuProvider: React.FC<BasicProp> = ({ children }) => { hideMenu(); } }); - }, []) + }, [hideMenu]) const value = useMemo<MenuProviderType>(() => { return { diff --git a/react-ui/src/shared/provider/utils.provider.tsx b/react-ui/src/shared/provider/utils.provider.tsx index 6f6775343..ca6aa1d32 100644 --- a/react-ui/src/shared/provider/utils.provider.tsx +++ b/react-ui/src/shared/provider/utils.provider.tsx @@ -8,7 +8,7 @@ interface UtilsProviderType { } const UtilsContext = createContext<UtilsProviderType>({ - toClipboard: function (text: string): void { + toClipboard: function (): void { throw new Error("Function not implemented."); } }) @@ -23,7 +23,7 @@ export const UtilsProvider: React.FC<BasicProp> = ({ children }) => { toast.info(t('global.toast.copied')) }, } as UtilsProviderType - }, []) + }, [t]) return ( <UtilsContext.Provider value={value}> diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index c7f9a43c1..a52ee84d3 100755 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -6,7 +6,7 @@ import { setToken } from './user.reducer' interface ThunkEntityDTO { thunk: any - payload: any + payload: Object /** * Only one subscription per category is allowed. New subscription will unsubscribe and overwrite the old one @@ -45,14 +45,14 @@ const RoutineSlice = createSlice({ }, setThunkId: (state, { payload }: PayloadAction<{ id: number; category: CATEGORIES }>) => { - const thunk = state.thunks[CATEGORIES[payload.category]] + const thunk = state.thunks[CATEGORIES[payload.category] as any] if (!thunk) { // TODO throw new Error('Thunk not found') } - state.thunks[CATEGORIES[payload.category]] = { ...thunk, id: payload.id, locked: false } + state.thunks[CATEGORIES[payload.category] as any] = { ...thunk, id: payload.id, locked: false } }, removeAll: (state) => { @@ -107,8 +107,13 @@ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { const { routine } = listenerApi.getOriginalState() as RootState - const lastThunk = routine.thunks[CATEGORIES[action.payload.category]] + const lastThunk = routine.thunks[CATEGORIES[action.payload.category] as any] if (lastThunk) { + if (!lastThunk.id) { + throw new Error() + // TODO + } + RoutineManager.unsubscribe(lastThunk.id) } }, -- GitLab From aff1313b79fccc63869cda70d9751f2aab6779ab Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 18 Dec 2024 14:45:40 +0100 Subject: [PATCH 43/78] create nginx webserver --- react-ui/.gitignore | 1 + react-ui/docker/webserver/Dockerfile | 4 + react-ui/docker/webserver/nginx.conf | 154 ++++++++++++++++++ react-ui/package.json | 17 +- react-ui/scripts/build.sh | 17 ++ react-ui/scripts/clean.sh | 5 - react-ui/src/shared/api/api.ts | 152 +++++++++++++---- .../viewmodel/json_viewer.viewmodel.tsx | 4 +- 8 files changed, 304 insertions(+), 50 deletions(-) create mode 100644 react-ui/docker/webserver/Dockerfile create mode 100644 react-ui/docker/webserver/nginx.conf create mode 100755 react-ui/scripts/build.sh delete mode 100755 react-ui/scripts/clean.sh diff --git a/react-ui/.gitignore b/react-ui/.gitignore index 5ec5a7340..2773d47af 100755 --- a/react-ui/.gitignore +++ b/react-ui/.gitignore @@ -8,6 +8,7 @@ # testing /coverage +/tmp # api /src/api/** diff --git a/react-ui/docker/webserver/Dockerfile b/react-ui/docker/webserver/Dockerfile new file mode 100644 index 000000000..f4644ee10 --- /dev/null +++ b/react-ui/docker/webserver/Dockerfile @@ -0,0 +1,4 @@ +FROM nginx:alpine3.20 + +COPY dist /usr/share/nginx/html +COPY docker/webserver/nginx.conf /etc/nginx/nginx.conf \ No newline at end of file diff --git a/react-ui/docker/webserver/nginx.conf b/react-ui/docker/webserver/nginx.conf new file mode 100644 index 000000000..87066f6ab --- /dev/null +++ b/react-ui/docker/webserver/nginx.conf @@ -0,0 +1,154 @@ + +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +#pid logs/nginx.pid; + + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + resolver 127.0.0.11 ipv6=off; + + #gzip on; + + server { + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + + + location ^~ /api/ { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # CORS headers + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always; + add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; + + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + + # Remove /api prefix when proxying + rewrite ^/api/(.*) /$1 break; + proxy_pass http://clab-gosdn_csbi_arista_base-gosdn:8080; + } + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + location ~* \.(js|css|jpg|png|svg|woff|woff2|ttf|otf|eot|ico)$ { + root /usr/share/nginx/html; + add_header 'Access-Control-Allow-Origin' '*' always; + expires 30d; + add_header Cache-Control "public"; + } + + # #error_page 404 /404.html; + + # # redirect server error pages to the static page /50x.html + # # + # error_page 500 502 503 504 /50x.html; + # location = /50x.html { + # root html; + # } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + +} \ No newline at end of file diff --git a/react-ui/package.json b/react-ui/package.json index 466870928..709c5bfcb 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -1,6 +1,10 @@ { "name": "react-ui", "version": "0.1.0", + "author": { + "name": "Matthias Feyll", + "email": "matthias.feyll@stud.h-da.de" + }, "private": true, "type": "module", "dependencies": { @@ -29,17 +33,15 @@ }, "scripts": { "start": "vite", - "build": "tsc && vite build", - "test": "react-scripts test", + "build::frontend": "vite build", "build::api": "npx @rtk-query/codegen-openapi ./scripts/openapi-config.json", + "build": "yarn build::api && yarn build::frontend", "lint": "eslint src", - "lint::fix": "eslint src --fix", - "clean": "./scripts/clean.sh" + "lint::fix": "eslint src --fix" }, "eslintConfig": { "extends": [ - "react-app", - "react-app/jest" + "react-app" ] }, "browserslist": { @@ -54,7 +56,6 @@ "last 1 safari version" ] }, - "proxy": "http://localhost:55055", "devDependencies": { "@babel/runtime": "^7.21.5", "@rtk-query/codegen-openapi": "^2.0.0", @@ -84,4 +85,4 @@ "vite": "^6.0.3", "vite-bundle-visualizer": "^1.2.1" } -} +} \ No newline at end of file diff --git a/react-ui/scripts/build.sh b/react-ui/scripts/build.sh new file mode 100755 index 000000000..ad0f0cd0b --- /dev/null +++ b/react-ui/scripts/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env sh + +IMAGE=node:23-alpine3.20 + +docker run --rm \ + -v $(pwd):/app \ + -w /app \ + -u $(id -u):$(id -g) \ + $IMAGE \ + yarn install && yarn build + +if [ $? -ne 0 ]; then + echo "Error while building frontend app" + exit 1 +fi + +echo "Build successfully in $(pwd)/dist" diff --git a/react-ui/scripts/clean.sh b/react-ui/scripts/clean.sh deleted file mode 100755 index 4220321a8..000000000 --- a/react-ui/scripts/clean.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh - -docker rmi react-ui-cpp-build - -rm -rf ./build \ No newline at end of file diff --git a/react-ui/src/shared/api/api.ts b/react-ui/src/shared/api/api.ts index c964d9dc9..32969f168 100755 --- a/react-ui/src/shared/api/api.ts +++ b/react-ui/src/shared/api/api.ts @@ -34,7 +34,9 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/export/${queryArg.pid}`, - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), providesTags: ['ConfigurationManagementService'], }), @@ -52,7 +54,10 @@ const injectedRtkApi = api }), invalidatesTags: ['ConfigurationManagementService'], }), - authServiceLogin: build.mutation<AuthServiceLoginApiResponse, AuthServiceLoginApiArg>({ + authServiceLogin: build.mutation< + AuthServiceLoginApiResponse, + AuthServiceLoginApiArg + >({ query: (queryArg) => ({ url: `/login`, method: 'POST', @@ -67,7 +72,9 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/logout/${queryArg.username}`, method: 'POST', - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), invalidatesTags: ['AuthService'], }), @@ -77,7 +84,10 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes`, - params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, }), providesTags: ['NetworkElementService'], }), @@ -98,7 +108,10 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/changes`, - params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, }), providesTags: ['NetworkElementService'], }), @@ -119,7 +132,10 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/changes/${queryArg.cuid}`, - params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, }), providesTags: ['NetworkElementService'], }), @@ -140,7 +156,10 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}`, - params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, }), providesTags: ['NetworkElementService'], }), @@ -151,7 +170,10 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}`, method: 'DELETE', - params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, }), invalidatesTags: ['NetworkElementService'], }), @@ -161,7 +183,10 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}/intendedpaths/${queryArg.intendedPath}`, - params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, }), providesTags: ['NetworkElementService'], }), @@ -171,7 +196,10 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/mnes/${queryArg.mneid}/paths/${queryArg.path}`, - params: { timestamp: queryArg.timestamp, pid: queryArg.pid }, + params: { + timestamp: queryArg.timestamp, + pid: queryArg.pid, + }, }), providesTags: ['NetworkElementService'], }), @@ -186,10 +214,15 @@ const injectedRtkApi = api }), invalidatesTags: ['NetworkElementService'], }), - pndServiceGetPnd: build.query<PndServiceGetPndApiResponse, PndServiceGetPndApiArg>({ + pndServiceGetPnd: build.query< + PndServiceGetPndApiResponse, + PndServiceGetPndApiArg + >({ query: (queryArg) => ({ url: `/pnd/${queryArg.pid}`, - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), providesTags: ['PndService'], }), @@ -197,7 +230,12 @@ const injectedRtkApi = api PndServiceGetPndListApiResponse, PndServiceGetPndListApiArg >({ - query: (queryArg) => ({ url: `/pnds`, params: { timestamp: queryArg.timestamp } }), + query: (queryArg) => ({ + url: `/pnds`, + params: { + timestamp: queryArg.timestamp, + }, + }), providesTags: ['PndService'], }), pndServiceCreatePndList: build.mutation< @@ -218,7 +256,9 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/pnds/${queryArg.pid}`, method: 'DELETE', - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), invalidatesTags: ['PndService'], }), @@ -237,7 +277,12 @@ const injectedRtkApi = api RoleServiceGetRolesApiResponse, RoleServiceGetRolesApiArg >({ - query: (queryArg) => ({ url: `/roles`, params: { timestamp: queryArg.timestamp } }), + query: (queryArg) => ({ + url: `/roles`, + params: { + timestamp: queryArg.timestamp, + }, + }), providesTags: ['RoleService'], }), roleServiceCreateRoles: build.mutation< @@ -258,7 +303,10 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/roles/delete`, method: 'DELETE', - params: { timestamp: queryArg.timestamp, roleName: queryArg.roleName }, + params: { + timestamp: queryArg.timestamp, + roleName: queryArg.roleName, + }, }), invalidatesTags: ['RoleService'], }), @@ -308,7 +356,9 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/routing`, - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), providesTags: ['RoutingTableService'], }), @@ -330,7 +380,10 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/routing/delete`, method: 'DELETE', - params: { timestamp: queryArg.timestamp, id: queryArg.id }, + params: { + timestamp: queryArg.timestamp, + id: queryArg.id, + }, }), invalidatesTags: ['RoutingTableService'], }), @@ -340,7 +393,9 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/submanagement/reset`, - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), providesTags: ['SubscriptionManagementService'], }), @@ -350,7 +405,9 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/submanagement/subscriptions`, - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), providesTags: ['SubscriptionManagementService'], }), @@ -371,7 +428,9 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/submanagement/${queryArg.subid}`, - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), providesTags: ['SubscriptionManagementService'], }), @@ -382,7 +441,9 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/submanagement/${queryArg.subid}`, method: 'DELETE', - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), invalidatesTags: ['SubscriptionManagementService'], }), @@ -392,7 +453,9 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/topology`, - params: { timestamp: queryArg.timestamp }, + params: { + timestamp: queryArg.timestamp, + }, }), providesTags: ['TopologyService'], }), @@ -414,7 +477,10 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/topology/delete`, method: 'DELETE', - params: { timestamp: queryArg.timestamp, id: queryArg.id }, + params: { + timestamp: queryArg.timestamp, + id: queryArg.id, + }, }), invalidatesTags: ['TopologyService'], }), @@ -433,7 +499,12 @@ const injectedRtkApi = api UserServiceGetUsersApiResponse, UserServiceGetUsersApiArg >({ - query: (queryArg) => ({ url: `/users`, params: { timestamp: queryArg.timestamp } }), + query: (queryArg) => ({ + url: `/users`, + params: { + timestamp: queryArg.timestamp, + }, + }), providesTags: ['UserService'], }), userServiceCreateUsers: build.mutation< @@ -454,7 +525,10 @@ const injectedRtkApi = api query: (queryArg) => ({ url: `/users/delete`, method: 'DELETE', - params: { timestamp: queryArg.timestamp, username: queryArg.username }, + params: { + timestamp: queryArg.timestamp, + username: queryArg.username, + }, }), invalidatesTags: ['UserService'], }), @@ -464,7 +538,11 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/users/get`, - params: { timestamp: queryArg.timestamp, name: queryArg.name, id: queryArg.id }, + params: { + timestamp: queryArg.timestamp, + name: queryArg.name, + id: queryArg.id, + }, }), providesTags: ['UserService'], }), @@ -485,7 +563,10 @@ const injectedRtkApi = api >({ query: (queryArg) => ({ url: `/yang/parse`, - params: { timestamp: queryArg.timestamp, yang: queryArg.yang }, + params: { + timestamp: queryArg.timestamp, + yang: queryArg.yang, + }, }), providesTags: ['NetworkElementService'], }), @@ -513,7 +594,8 @@ export type ConfigurationManagementServiceImportSdnConfigApiArg = { timestamp?: string sdnConfigData?: string } -export type AuthServiceLoginApiResponse = /** status 200 A successful response. */ RbacLoginResponse +export type AuthServiceLoginApiResponse = + /** status 200 A successful response. */ RbacLoginResponse export type AuthServiceLoginApiArg = { rbacLoginRequest: Login } @@ -598,7 +680,8 @@ export type NetworkElementServiceUpdateApiResponse = export type NetworkElementServiceUpdateApiArg = { networkelementUpdateNetworkElementRequest: TodoChangeNameToFitTheRest } -export type PndServiceGetPndApiResponse = /** status 200 A successful response. */ PndGetPndResponse +export type PndServiceGetPndApiResponse = + /** status 200 A successful response. */ PndGetPndResponse export type PndServiceGetPndApiArg = { pid: string /** Timestamp in nanoseconds since Epoch. */ @@ -867,10 +950,11 @@ export type TransportGnmiTransportOption = { } export type TransportRestconfTransportOption = object export type ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums = - | 'TYPE_UNSPECIFIED' - | 'TYPE_OPENCONFIG' - | 'TYPE_CONTAINERISED' - | 'TYPE_PLUGIN' + + | 'TYPE_UNSPECIFIED' + | 'TYPE_OPENCONFIG' + | 'TYPE_CONTAINERISED' + | 'TYPE_PLUGIN' export type TransportTransportOption = { address?: string username?: string diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index da78528f2..6c3ac78f3 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -18,8 +18,6 @@ interface JsonViewerViewModelType { container: React.RefObject<HTMLElement> } -export const MARKED = "?marked" - export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelType) => { const { breadcrumbs, collapseContainer } = useAppSelector(state => state.json_viwer) const dispatch = useAppDispatch(); @@ -128,7 +126,7 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy return found } - const parameterizedJson = useMemo<MutableRefObject<Array<string>>>(() => { + const parameterizedJson = useMemo<MutableRefObject<string[]>>(() => { parameterizedJsonMap.current = [] if (searchTerm === "") { return json -- GitLab From a7e88c268e6608fa81a0503b87fef51d30278b24 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Tue, 7 Jan 2025 11:37:12 +0100 Subject: [PATCH 44/78] add react ui to containerlab --- .gitlab/ci/.build-binaries.yml | 1 + .gitlab/ci/.build-container-images.yml | 10 ++++++++++ .gitlab/ci/.react-ui.yml | 3 --- Makefile | 2 +- dev_env_data/clab/gosdn_slim.clab.yaml | 7 +++++++ .../docker-compose/basic_docker-compose.yml | 5 +++++ makefiles/container/Makefile | 3 +++ plugin-registry/plugin-registry.Dockerfile | 7 ++++--- react-ui/.dockerignore | 5 +++++ react-ui/docker/webserver/Dockerfile | 15 ++++++++++++--- react-ui/docker/webserver/nginx.conf | 1 - react-ui/scripts/build.sh | 2 +- react-ui/vite.config.mjs | 3 ++- 13 files changed, 51 insertions(+), 13 deletions(-) delete mode 100644 .gitlab/ci/.react-ui.yml create mode 100644 react-ui/.dockerignore diff --git a/.gitlab/ci/.build-binaries.yml b/.gitlab/ci/.build-binaries.yml index 174203fdc..4877cd169 100644 --- a/.gitlab/ci/.build-binaries.yml +++ b/.gitlab/ci/.build-binaries.yml @@ -16,5 +16,6 @@ build-all-binaries: - artifacts/venv-manager - artifacts/inventory-manager - artifacts/plugin-registry + - artifacts/react-ui expire_in: 1 week <<: *build-binaries diff --git a/.gitlab/ci/.build-container-images.yml b/.gitlab/ci/.build-container-images.yml index da70dcba2..79e22bc63 100644 --- a/.gitlab/ci/.build-container-images.yml +++ b/.gitlab/ci/.build-container-images.yml @@ -75,6 +75,16 @@ build-inventory-manager-image: - docker push "$INVENTORY_MANAGER_IMAGE_NAME:$CI_COMMIT_REF_SLUG" <<: *build +build-react-ui-image: + script: + - REACT_UI_IMAGE_NAME="${CI_REGISTRY_IMAGE}/react-ui" + - docker buildx build -t "$REACT_UI_IMAGE_NAME:$CI_COMMIT_SHA" -f "${CI_PROJECT_DIR}/react-ui/docker/webserver/Dockerfile" ./react-ui + - docker push "$REACT_UI_IMAGE_NAME:$CI_COMMIT_SHA" + - docker tag "$REACT_UI_IMAGE_NAME:$CI_COMMIT_SHA" "$REACT_UI_IMAGE_NAME:$CI_COMMIT_REF_SLUG" + - docker push "$REACT_UI_IMAGE_NAME:$CI_COMMIT_REF_SLUG" + <<: *build + + build-integration-test-images: needs: ["build-controller-image"] script: diff --git a/.gitlab/ci/.react-ui.yml b/.gitlab/ci/.react-ui.yml deleted file mode 100644 index 873b694c8..000000000 --- a/.gitlab/ci/.react-ui.yml +++ /dev/null @@ -1,3 +0,0 @@ -build-react-ui: - stage: build - \ No newline at end of file diff --git a/Makefile b/Makefile index 0cd0ed66d..693329772 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ lint-fix: install-tools build: pre build-gosdn build-gosdnc build-plugin-registry build-venv-manager build-arista-routing-engine-app build-hostname-checker-app build-basic-interface-monitoring-app build-inventory-manager -containerize-all: containerize-gosdn containerize-gosdnc containerize-plugin-registry containerize-venv-manager containerize-arista-routing-engine-app containerize-inventory-manager +containerize-all: containerize-gosdn containerize-gosdnc containerize-plugin-registry containerize-venv-manager containerize-arista-routing-engine-app containerize-inventory-manager containerize-react-ui generate-all-certs: pre generate-root-ca generate-gosdn-certs generate-gnmi-target-certs diff --git a/dev_env_data/clab/gosdn_slim.clab.yaml b/dev_env_data/clab/gosdn_slim.clab.yaml index f4d76846c..b3ef8eb08 100644 --- a/dev_env_data/clab/gosdn_slim.clab.yaml +++ b/dev_env_data/clab/gosdn_slim.clab.yaml @@ -13,6 +13,13 @@ topology: image: plugin-registry mgmt-ipv4: 172.100.0.16 + react-ui: + kind: linux + image: react-ui + ports: + - 127.0.0.1:8088:80 + mgmt-ipv4: 172.100.0.6 + gosdn: kind: linux image: gosdn diff --git a/dev_env_data/docker-compose/basic_docker-compose.yml b/dev_env_data/docker-compose/basic_docker-compose.yml index 4e7664161..2544e7b0f 100644 --- a/dev_env_data/docker-compose/basic_docker-compose.yml +++ b/dev_env_data/docker-compose/basic_docker-compose.yml @@ -75,5 +75,10 @@ services: command: start --cert /etc/gnmi-target/ssl/certs/gnmi-target-selfsigned.crt --key /etc/gnmi-target/ssl/private/gnmi-target-selfsigned.key --ca_file /etc/gnmi-target/ssl/ca.crt + react-ui: + image: react-ui + ports: + - 127.0.0.1:8088:80 + volumes: mongo-db-basic: diff --git a/makefiles/container/Makefile b/makefiles/container/Makefile index c9c21b972..6e3b97242 100644 --- a/makefiles/container/Makefile +++ b/makefiles/container/Makefile @@ -25,3 +25,6 @@ containerize-ws-events-app: containerize-inventory-manager: docker buildx build --rm -t venv-manager --load -f applications/inventory-manager/inventory-manager.Dockerfile . + +containerize-react-ui: + docker buildx build --rm --load -t react-ui -f react-ui/docker/webserver/Dockerfile . diff --git a/plugin-registry/plugin-registry.Dockerfile b/plugin-registry/plugin-registry.Dockerfile index 05d3aad83..292a134fd 100644 --- a/plugin-registry/plugin-registry.Dockerfile +++ b/plugin-registry/plugin-registry.Dockerfile @@ -4,8 +4,9 @@ ARG GITLAB_PROXY FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm as builder WORKDIR /plugin-registry/ -RUN apt-get update -RUN apt-get -y install --no-install-recommends zip +RUN apt-get update && \ + apt-get -y install --no-install-recommends zip && \ + rm -rf /var/lib/apt/lists/* COPY . . RUN --mount=type=cache,target=/root/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ @@ -21,4 +22,4 @@ WORKDIR /app/ COPY --from=builder /plugin-registry/artifacts/plugin-registry . COPY --from=builder /plugin-registry/plugin-registry/plugins ./plugins COPY --from=builder /plugin-registry/dev_env_data/plugin-registry/plugin-store.json ./plugin-store.json -ENTRYPOINT ["./plugin-registry", "-socket", "55057"] +ENTRYPOINT ["./plugin-registry", "-socket", "55057"] \ No newline at end of file diff --git a/react-ui/.dockerignore b/react-ui/.dockerignore new file mode 100644 index 000000000..5ecec0472 --- /dev/null +++ b/react-ui/.dockerignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +vite/ +tmp/ +.vscode/ \ No newline at end of file diff --git a/react-ui/docker/webserver/Dockerfile b/react-ui/docker/webserver/Dockerfile index f4644ee10..71127c09b 100644 --- a/react-ui/docker/webserver/Dockerfile +++ b/react-ui/docker/webserver/Dockerfile @@ -1,4 +1,13 @@ -FROM nginx:alpine3.20 +FROM node:alpine3.20 as builder + +COPY ./api/openapiv2/gosdn_northbound.swagger.json /app/api/openapiv2/gosdn_northbound.swagger.json +COPY ./react-ui /app/react-ui + +RUN cd /app/react-ui && yarn && yarn build -COPY dist /usr/share/nginx/html -COPY docker/webserver/nginx.conf /etc/nginx/nginx.conf \ No newline at end of file + +# webserver +FROM nginx:alpine3.20 +COPY --from=builder /app/react-ui/dist /usr/share/nginx/html +COPY --from=builder /app/react-ui/docker/webserver/nginx.conf /etc/nginx/nginx.conf +EXPOSE 80 \ No newline at end of file diff --git a/react-ui/docker/webserver/nginx.conf b/react-ui/docker/webserver/nginx.conf index 87066f6ab..eb4fc2be9 100644 --- a/react-ui/docker/webserver/nginx.conf +++ b/react-ui/docker/webserver/nginx.conf @@ -41,7 +41,6 @@ http { #access_log logs/host.access.log main; - location ^~ /api/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; diff --git a/react-ui/scripts/build.sh b/react-ui/scripts/build.sh index ad0f0cd0b..fb6cb2a21 100755 --- a/react-ui/scripts/build.sh +++ b/react-ui/scripts/build.sh @@ -7,7 +7,7 @@ docker run --rm \ -w /app \ -u $(id -u):$(id -g) \ $IMAGE \ - yarn install && yarn build + yarn && yarn build if [ $? -ne 0 ]; then echo "Error while building frontend app" diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index fefafe05a..fc4ce4a01 100755 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -8,10 +8,11 @@ export default defineConfig({ }, // develop server server: { + host: true, port: 3000, proxy: { '/api': { - target: 'http://127.0.0.1:8080', + target: 'http://clab-gosdn_csbi_arista_base-gosdn:8080', changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/api/, ''), -- GitLab From c4769a395fdbb1ba9b4e98adf6f71d90877d7b0d Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Tue, 7 Jan 2025 12:45:35 +0100 Subject: [PATCH 45/78] fix ci docker image build path --- .gitlab/ci/.build-container-images.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/ci/.build-container-images.yml b/.gitlab/ci/.build-container-images.yml index 79e22bc63..7fda52178 100644 --- a/.gitlab/ci/.build-container-images.yml +++ b/.gitlab/ci/.build-container-images.yml @@ -78,7 +78,7 @@ build-inventory-manager-image: build-react-ui-image: script: - REACT_UI_IMAGE_NAME="${CI_REGISTRY_IMAGE}/react-ui" - - docker buildx build -t "$REACT_UI_IMAGE_NAME:$CI_COMMIT_SHA" -f "${CI_PROJECT_DIR}/react-ui/docker/webserver/Dockerfile" ./react-ui + - docker buildx build -t "$REACT_UI_IMAGE_NAME:$CI_COMMIT_SHA" -f "${CI_PROJECT_DIR}/react-ui/docker/webserver/Dockerfile" . - docker push "$REACT_UI_IMAGE_NAME:$CI_COMMIT_SHA" - docker tag "$REACT_UI_IMAGE_NAME:$CI_COMMIT_SHA" "$REACT_UI_IMAGE_NAME:$CI_COMMIT_REF_SLUG" - docker push "$REACT_UI_IMAGE_NAME:$CI_COMMIT_REF_SLUG" -- GitLab From f974bee2e9b00ff93b9e98f32f76ada46c1cec2b Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 8 Jan 2025 10:32:16 +0100 Subject: [PATCH 46/78] (ui): add dev env script --- react-ui/package.json | 3 ++- react-ui/scripts/dev.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100755 react-ui/scripts/dev.sh diff --git a/react-ui/package.json b/react-ui/package.json index 709c5bfcb..4c9271009 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -37,7 +37,8 @@ "build::api": "npx @rtk-query/codegen-openapi ./scripts/openapi-config.json", "build": "yarn build::api && yarn build::frontend", "lint": "eslint src", - "lint::fix": "eslint src --fix" + "lint::fix": "eslint src --fix", + "dev": "./scripts/dev.sh" }, "eslintConfig": { "extends": [ diff --git a/react-ui/scripts/dev.sh b/react-ui/scripts/dev.sh new file mode 100755 index 000000000..3a2d20885 --- /dev/null +++ b/react-ui/scripts/dev.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + +docker run \ + -it \ + --rm \ + -v $(pwd):/app \ + -w /app \ + -p 127.0.0.1:3000:3000 \ + --network gosdn-csbi-arista-base-net \ + node:20-alpine3.20 \ + npx vite -- GitLab From f0db60043944aca1ca3313147f1912c57318d849 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 8 Jan 2025 11:29:44 +0100 Subject: [PATCH 47/78] wip before changing unsubscribe to category param --- .../src/components/devices/api/pnd.fetch.ts | 14 +++++++ .../devices/reducer/device.reducer.ts | 38 +++++++---------- react-ui/src/index.tsx | 1 + react-ui/src/shared/api/user.fetch.ts | 25 +++++++++++ react-ui/src/shared/helper/debug.ts | 5 +++ .../protected.layout/protected.layout.tsx | 4 +- .../src/shared/reducer/routine.reducer.ts | 42 ++++++++++++++----- react-ui/src/shared/reducer/user.reducer.ts | 30 ++----------- react-ui/src/shared/utils/routine.manager.ts | 2 +- 9 files changed, 96 insertions(+), 65 deletions(-) create mode 100644 react-ui/src/components/devices/api/pnd.fetch.ts create mode 100644 react-ui/src/shared/api/user.fetch.ts create mode 100644 react-ui/src/shared/helper/debug.ts diff --git a/react-ui/src/components/devices/api/pnd.fetch.ts b/react-ui/src/components/devices/api/pnd.fetch.ts new file mode 100644 index 000000000..6e677ab8d --- /dev/null +++ b/react-ui/src/components/devices/api/pnd.fetch.ts @@ -0,0 +1,14 @@ +import { PndServiceGetPndListApiArg, api } from "@api/api" +import { createAsyncThunk } from "@reduxjs/toolkit" +import { setPnds } from "../reducer/device.reducer" + +export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { + const payload: PndServiceGetPndListApiArg = { + timestamp: new Date().getTime().toString(), + } + + const subscription = thunkApi.dispatch(api.endpoints.pndServiceGetPndList.initiate(payload)) + subscription.unwrap().then((response) => { + thunkApi.dispatch(setPnds(response.pnd)) + }) +}) \ No newline at end of file diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index 8e4454bd2..f574509be 100755 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -1,12 +1,10 @@ import { - api, NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, - PndPrincipalNetworkDomain, - PndServiceGetPndListApiArg, + PndPrincipalNetworkDomain } from '@api/api' import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs' -import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit' +import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { RootState } from 'src/stores' import '../routines/index' import { startListening } from '/src/stores/middleware/listener.middleware' @@ -40,11 +38,11 @@ const deviceSlice = createSlice({ name: 'device', initialState, reducers: { - setDevices: (state, action: PayloadAction<Device[]>) => { - state.devices = action.payload + setDevices: (state, action: PayloadAction<Device[] | undefined>) => { + state.devices = action.payload || [] }, - setPnds: (state, action: PayloadAction<PndPrincipalNetworkDomain[]>) => { - state.pnds = action.payload + setPnds: (state, action: PayloadAction<PndPrincipalNetworkDomain[] | undefined>) => { + state.pnds = action.payload || [] }, setActiveTab: (state, action: PayloadAction<DeviceViewTabValues>) => { state.activeTab = action.payload @@ -77,31 +75,23 @@ const deviceSlice = createSlice({ }, }) -export const { setDevices, setActiveTab, setSelectedDevice, setSelectedMne, setSelectedJson } = +export const { setDevices, setActiveTab, setSelectedDevice, setSelectedMne, setSelectedJson, setPnds } = deviceSlice.actions -const { setPnds } = deviceSlice.actions export default deviceSlice.reducer export const deviceReducerPath = deviceSlice.reducerPath -export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { - const payload: PndServiceGetPndListApiArg = { - timestamp: new Date().getTime().toString(), - } - - const subscription = thunkApi.dispatch(api.endpoints.pndServiceGetPndList.initiate(payload)) - subscription.unwrap().then((response) => { - thunkApi.dispatch(setPnds(response.pnd)) - }) -}) - // add default selected device if no selected device is set startListening({ predicate: (action) => setDevices.match(action), effect: async (action, listenerApi) => { - const { device } = listenerApi.getOriginalState() as RootState - if (!device.selectedDevice && !!action.payload[0]) { - listenerApi.dispatch(setSelectedDevice(action.payload[0])) + const { device: state } = listenerApi.getOriginalState() as RootState + if (state.selectedDevice) { + return } + + // if there are no devices available do set null + const newDevices = action.payload?.[0] || null + listenerApi.dispatch(setSelectedDevice(newDevices)) }, }) diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 8383248ce..3697efd07 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -16,6 +16,7 @@ import { router } from './routes' import './shared/icons/icons' import { persistor, store } from './stores' +window.env = window.location.hostname === 'localhost' ? 'development' : 'production'; ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> diff --git a/react-ui/src/shared/api/user.fetch.ts b/react-ui/src/shared/api/user.fetch.ts new file mode 100644 index 000000000..1b6dd344e --- /dev/null +++ b/react-ui/src/shared/api/user.fetch.ts @@ -0,0 +1,25 @@ +import { createAsyncThunk } from "@reduxjs/toolkit" +import { setUser } from "@shared/reducer/user.reducer" +import { RootState } from "src/stores" +import { api, UserServiceGetUsersApiArg } from "./api" + +export const fetchUser = createAsyncThunk('user/fetchUser', (_, thunkAPI) => { + const payload: UserServiceGetUsersApiArg = {} + + thunkAPI.dispatch(api.endpoints.userServiceGetUsers.initiate(payload)).then((response) => { + if (response.error || !response.data?.user?.length) { + // TODO proper error handling + throw new Error('Fetching the pnd list after successful login failed') + } + + const { user } = thunkAPI.getState() as RootState + const matchedUser = response.data.user.find((_user) => _user.name === user.username) + + if (!matchedUser) { + // TODO proper error handling + throw new Error('No user found with the provided username') + } + + thunkAPI.dispatch(setUser(matchedUser)) + }) +}) diff --git a/react-ui/src/shared/helper/debug.ts b/react-ui/src/shared/helper/debug.ts new file mode 100644 index 000000000..6628989b8 --- /dev/null +++ b/react-ui/src/shared/helper/debug.ts @@ -0,0 +1,5 @@ +export const debugMessage = (message: string) => { + if (window?.env === 'development') { + console.warn("Debug: \n" + message) + } +} \ No newline at end of file diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index c7e13c6fe..17b6209a5 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -1,12 +1,12 @@ +import { fetchUser } from '@api/user.fetch'; import logo from '@assets/logo.svg'; -import { fetchPnds } from '@component/devices/reducer/device.reducer'; +import { fetchPnds } from '@component/devices/api/pnd.fetch'; import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useAppDispatch, useAppSelector } from '@hooks'; import { useAuth } from "@provider/auth.provider"; import { MenuProvider } from '@provider/menu/menu.provider'; import { DEVICE_URL, LOGIN_URL } from '@routes'; -import { fetchUser } from '@shared/reducer/user.reducer'; import React, { useEffect } from "react"; import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index a52ee84d3..fc5a4b35b 100755 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,33 +1,43 @@ +import { debugMessage } from '@helper/debug' import { PayloadAction, createSlice } from '@reduxjs/toolkit' import { RoutineManager } from '@utils/routine.manager' import { RootState } from '../../stores' import { startListening } from '../../stores/middleware/listener.middleware' import { setToken } from './user.reducer' +// ---------------- thunk types ---------------- + interface ThunkEntityDTO { thunk: any payload: Object /** - * Only one subscription per category is allowed. New subscription will unsubscribe and overwrite the old one + * Only one subscription per category is allowed. + * New subscription will unsubscribe and overwrite the old one */ category: CATEGORIES } -interface ThunkEntity extends ThunkEntityDTO { +/** + * This Wrapper holds the actual thunk information + * as well as additional information + */ +interface ThunkWrapper extends ThunkEntityDTO { id?: number locked: boolean } -export interface ReducerState { - thunks: { [key in keyof typeof CATEGORIES]: ThunkEntity | null } -} - export enum CATEGORIES { TABLE, TAB, } +// ---------------- reducer types ---------------- + +export interface ReducerState { + thunks: { [key in keyof typeof CATEGORIES]: ThunkWrapper | null } +} + const initialState: ReducerState = { thunks: { TABLE: null, @@ -40,7 +50,11 @@ const RoutineSlice = createSlice({ initialState, reducers: { addRoutine: (state: any, { payload }: PayloadAction<ThunkEntityDTO>) => { - const newThunk: ThunkEntity = { ...payload, locked: true } + if (state.thunks[CATEGORIES[payload.category]]?.locked) { + + } + + const newThunk: ThunkWrapper = { ...payload, locked: true } state.thunks[CATEGORIES[payload.category]] = newThunk }, @@ -48,8 +62,8 @@ const RoutineSlice = createSlice({ const thunk = state.thunks[CATEGORIES[payload.category] as any] if (!thunk) { - // TODO - throw new Error('Thunk not found') + debugMessage("Desired thunk of category " + payload.category + " is not available") + return } state.thunks[CATEGORIES[payload.category] as any] = { ...thunk, id: payload.id, locked: false } @@ -89,11 +103,17 @@ startListening({ // }, // }) -// add new routine +/** + * Add new routine + * + * This listener handles the connection between the RoutingManager that + * stores the non persistable thunk object and the peristable thunk information. + * The persistable information are stored in this reducer + */ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const { thunk } = action.payload as ThunkEntity + const { thunk } = action.payload as ThunkWrapper const subscription = await listenerApi.dispatch(thunk(action.payload.payload)) const thunkId = await RoutineManager.add(subscription.payload) listenerApi.dispatch( diff --git a/react-ui/src/shared/reducer/user.reducer.ts b/react-ui/src/shared/reducer/user.reducer.ts index af0f2d171..a0f2d4222 100755 --- a/react-ui/src/shared/reducer/user.reducer.ts +++ b/react-ui/src/shared/reducer/user.reducer.ts @@ -1,7 +1,6 @@ -import { api, RbacUser, UserServiceGetUsersApiArg } from '@api/api' +import { RbacUser } from '@api/api' import { setCookieValue } from '@helper/coookie' -import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit' -import { RootState } from '..' +import { createSlice, PayloadAction } from '@reduxjs/toolkit' export interface UserSliceState { // defined by the frontend user input. This value is getting compared with the backend response @@ -34,27 +33,4 @@ export const { setToken } = userSlice.actions export const { setUser } = userSlice.actions export default userSlice.reducer -export const userReducerPath = userSlice.reducerPath - -export const fetchUser = createAsyncThunk('user/fetchUser', (_, thunkAPI) => { - const payload: UserServiceGetUsersApiArg = {} - - thunkAPI.dispatch(api.endpoints.userServiceGetUsers.initiate(payload)).then((response) => { - if (response.error || !response.data?.user?.length) { - // TODO proper error handling - throw new Error('Fetching the pnd list after successful login failed') - } - - const { user } = thunkAPI.getState() as RootState - - // TODO ask if this is the correct approach - const matchedUser = response.data.user.find((_user) => _user.name === user.username) - - if (!matchedUser) { - // TODO proper error handling - throw new Error('No user found with the provided username') - } - - thunkAPI.dispatch(setUser(matchedUser)) - }) -}) +export const userReducerPath = userSlice.reducerPath \ No newline at end of file diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index ade079289..2f1a8086a 100755 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -14,7 +14,7 @@ const initialState = { /** * Routine manager is a singleton that holds all running routines. * The redux store holds any persistable information about the routines. - * The routines objects itself are stored in the RoutineManager. + * The routine objects itself are stored in the RoutineManager. */ export const RoutineManager = (() => { const state = initialState -- GitLab From ed94aed4e0f4876966b3cffc037dd22e4765bcb8 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 8 Jan 2025 12:55:13 +0100 Subject: [PATCH 48/78] (ui): change routine identification to category --- .../src/components/devices/api/pnd.fetch.ts | 1 + .../devices/reducer/device.reducer.ts | 34 +++++---- .../devices/routines/device.routine.ts | 7 +- .../devices/routines/mne.routine.ts | 32 ++++++-- .../devices/view/device.view.table.tsx | 2 +- .../devices/view/device.view.tabs.tsx | 2 +- .../view_model/device.tabs.viewmodel.ts | 2 +- .../src/components/login/view/login.view.tsx | 2 +- .../json_viewer/view/json_viewer.view.tsx | 2 +- react-ui/src/shared/helper/debug.ts | 8 +- .../src/shared/provider/auth.provider.tsx | 2 +- .../shared/provider/menu/menu.provider.tsx | 2 +- .../src/shared/provider/utils.provider.tsx | 2 +- .../src/shared/reducer/routine.reducer.ts | 75 ++++-------------- react-ui/src/shared/types/category.type.ts | 17 +++++ .../interfaces.type.ts} | 0 react-ui/src/shared/types/thunk.type.ts | 12 +++ react-ui/src/shared/utils/routine.manager.ts | 76 ++++++++++--------- 18 files changed, 151 insertions(+), 127 deletions(-) create mode 100644 react-ui/src/shared/types/category.type.ts rename react-ui/src/shared/{helper/interfaces.ts => types/interfaces.type.ts} (100%) create mode 100644 react-ui/src/shared/types/thunk.type.ts diff --git a/react-ui/src/components/devices/api/pnd.fetch.ts b/react-ui/src/components/devices/api/pnd.fetch.ts index 6e677ab8d..fd49de636 100644 --- a/react-ui/src/components/devices/api/pnd.fetch.ts +++ b/react-ui/src/components/devices/api/pnd.fetch.ts @@ -2,6 +2,7 @@ import { PndServiceGetPndListApiArg, api } from "@api/api" import { createAsyncThunk } from "@reduxjs/toolkit" import { setPnds } from "../reducer/device.reducer" +// TODO rethink this. This should be in the shared part bc its getting invoked in the procteded layout export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { const payload: PndServiceGetPndListApiArg = { timestamp: new Date().getTime().toString(), diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index f574509be..9d91700c4 100755 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -11,27 +11,25 @@ import { startListening } from '/src/stores/middleware/listener.middleware' export type Device = NetworkelementFlattenedManagedNetworkElement -interface SelectedDeviceInterface { +interface SelectedObject { device: Device mne: NetworkelementManagedNetworkElement | null json: JSON | null } -type SelectedDeviceType = SelectedDeviceInterface | null - export interface DeviceSliceState { devices: Device[] pnds: PndPrincipalNetworkDomain[] activeTab: DeviceViewTabValues - selectedDevice: SelectedDeviceType + selected: SelectedObject | null } const initialState: DeviceSliceState = { devices: [], pnds: [], activeTab: DeviceViewTabValues.METADATA, - selectedDevice: null, + selected: null, } const deviceSlice = createSlice({ @@ -48,29 +46,33 @@ const deviceSlice = createSlice({ state.activeTab = action.payload }, setSelectedDevice: (state, action: PayloadAction<Device | null>) => { - let selectedDevice: SelectedDeviceType = null + let selectedObject = null; if (action.payload) { - selectedDevice = { device: action.payload, mne: null, json: null } + selectedObject = { device: action.payload, mne: null, json: null } } - state.selectedDevice = selectedDevice + state.selected = selectedObject }, setSelectedMne: (state, action: PayloadAction<NetworkelementManagedNetworkElement>) => { - if (!state.selectedDevice) { - throw new Error('Selected Device is null where it shouldn´t be null') + if (!state.selected) { + throw new Error('Can not find corresponding device') + } + + // safety check to prevent possible race conditions + if (state.selected.device.id !== action.payload.id) { + // TODO proper error handling by retry fetching the device object + throw new Error('Device and mne id does not match') } - state.selectedDevice.mne = action.payload - // TODO maybe don´t take the device of "selected device" instead search in the devices array for the proper device - // should not make a diffrence due to pointer but dunno + state.selected.mne = action.payload }, setSelectedJson: (state, action: PayloadAction<JSON>) => { - if (!state.selectedDevice) { + if (!state.selected) { throw new Error('Selected Device is null where it shouldn´t be null') } - state.selectedDevice.json = action.payload || null + state.selected.json = action.payload || null }, }, }) @@ -86,7 +88,7 @@ startListening({ predicate: (action) => setDevices.match(action), effect: async (action, listenerApi) => { const { device: state } = listenerApi.getOriginalState() as RootState - if (state.selectedDevice) { + if (state.selected) { return } diff --git a/react-ui/src/components/devices/routines/device.routine.ts b/react-ui/src/components/devices/routines/device.routine.ts index 10caffa2f..f9b3e1ee2 100755 --- a/react-ui/src/components/devices/routines/device.routine.ts +++ b/react-ui/src/components/devices/routines/device.routine.ts @@ -19,8 +19,13 @@ startListening({ export const fetchDevicesThunk = createAsyncThunk(FETCH_DEVICE_ACTION, (_, thunkApi) => { const { user } = thunkApi.getState() as RootState + if (!user.user?.roles) { + throw new Error('Background MNE fetching failed! User data is missing. Reload page or logout and login again') + // TODO + } + const payload: NetworkElementServiceGetAllFlattenedApiArg = { - pid: Object.keys(user?.user.roles)[0], + pid: Object.keys(user.user.roles)[0], timestamp: new Date().getTime().toString(), } diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts index 7de1d1814..a3ea43d2f 100755 --- a/react-ui/src/components/devices/routines/mne.routine.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -6,26 +6,38 @@ import { setSelectedMne, } from '@component/devices/reducer/device.reducer' import { createAsyncThunk } from '@reduxjs/toolkit' -import { addRoutine, CATEGORIES } from '@shared/reducer/routine.reducer' +import { addRoutine } from '@shared/reducer/routine.reducer' +import { Category } from '@shared/types/category.type' import { RootState } from 'src/stores' import { startListening } from '../../../stores/middleware/listener.middleware' export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE' -// fetch mne if selected device is set +/** + * #0 + * Trigger fetch MNE (#1) + * + * Triggered by a selectedDevice + */ startListening({ predicate: (action) => setSelectedDevice.match(action) && !!action.payload, effect: async (action, listenerApi) => { listenerApi.dispatch( addRoutine({ thunk: fetchSelectedMneThunk, - category: CATEGORIES.TAB, + category: Category.TAB, payload: action.payload, }) ) }, }) +/** + * #1 + * Fetch MNE + * + * Triggered by #0 + */ const FETCH_MNE_INTERVAL = 5000 // in ms export const fetchSelectedMneThunk = createAsyncThunk( FETCH_MNE_ACTION, @@ -56,7 +68,12 @@ export const fetchSelectedMneThunk = createAsyncThunk( } ) -// save fetched mne +/** + * #2 + * Received MNE + * + * Triggered by #1 + */ startListening({ predicate: (action) => api.endpoints.networkElementServiceGet.matchFulfilled(action), effect: async (action, listenerApi) => { @@ -64,7 +81,12 @@ startListening({ }, }) -// save fetched mne +/** + * #3 + * Fetch & receive json + * + * Triggered by #2 + */ startListening({ predicate: (action) => setSelectedMne.match(action), effect: async (action, listenerApi) => { diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index 312caab60..9b731fef5 100755 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next"; import { useDeviceTableViewModel } from "../view_model/device.table.viewmodel"; export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { - const { devices, pnds, selectedDevice } = useAppSelector(state => state.device); + const { devices, pnds, selected: selectedDevice } = useAppSelector(state => state.device); const { t } = useTranslation('common'); const { trClickHandler } = useDeviceTableViewModel(searchRef); diff --git a/react-ui/src/components/devices/view/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx index 2929f9b64..a2768a0ea 100755 --- a/react-ui/src/components/devices/view/device.view.tabs.tsx +++ b/react-ui/src/components/devices/view/device.view.tabs.tsx @@ -8,7 +8,7 @@ export enum DeviceViewTabValues { } export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { - const { selectedDevice } = useAppSelector(state => state.device); + const { selected: selectedDevice } = useAppSelector(state => state.device); const { jsonYang } = useDeviceTabsViewModel(); const metadataTab = () => { diff --git a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts index 4a60567b6..af4cc3abb 100755 --- a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts @@ -7,7 +7,7 @@ export enum DeviceViewTabValues { } export const useDeviceTabsViewModel = () => { - const { selectedDevice } = useAppSelector((state) => state.device) + const { selected: selectedDevice } = useAppSelector((state) => state.device) const getYangModelJSON = (): JSON | null => { if (!selectedDevice?.json) { diff --git a/react-ui/src/components/login/view/login.view.tsx b/react-ui/src/components/login/view/login.view.tsx index 03d7406f4..38afc83a1 100755 --- a/react-ui/src/components/login/view/login.view.tsx +++ b/react-ui/src/components/login/view/login.view.tsx @@ -1,5 +1,5 @@ import logo from '@assets/logo.svg' -import { BasicProp } from '@helper/interfaces' +import { BasicProp } from '@shared/types/interfaces.type' import React, { useRef } from 'react' import { Alert, Button, Col, Container, Form, Image, Row, Spinner } from 'react-bootstrap' import { useTranslation } from 'react-i18next' diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index 720f75c7d..b8358c686 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -130,7 +130,7 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { const searchHTML = () => { return ( <> - <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> + <Form.Group controlId='json_viewer.search' className='p-0 mx-1 pt-2'> <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={search} /> </Form.Group> </> diff --git a/react-ui/src/shared/helper/debug.ts b/react-ui/src/shared/helper/debug.ts index 6628989b8..db10a0979 100644 --- a/react-ui/src/shared/helper/debug.ts +++ b/react-ui/src/shared/helper/debug.ts @@ -1,5 +1,11 @@ -export const debugMessage = (message: string) => { +export const warnMessage = (message: string) => { if (window?.env === 'development') { console.warn("Debug: \n" + message) } +} + +export const infoMessage = (message: string) => { + if (window?.env === 'development') { + console.info("Info: \n" + message) + } } \ No newline at end of file diff --git a/react-ui/src/shared/provider/auth.provider.tsx b/react-ui/src/shared/provider/auth.provider.tsx index 69bdccbdf..77219bdce 100755 --- a/react-ui/src/shared/provider/auth.provider.tsx +++ b/react-ui/src/shared/provider/auth.provider.tsx @@ -1,8 +1,8 @@ import { AuthServiceLoginApiArg, AuthServiceLoginApiResponse, useAuthServiceLoginMutation } from "@api/api"; import { getCookieValue } from "@helper/coookie"; -import { BasicProp } from "@helper/interfaces"; import { useAppDispatch, useAppSelector } from "@hooks"; import { DEVICE_URL, LOGIN_URL } from "@routes"; +import { BasicProp } from "@shared/types/interfaces.type"; import { jwtDecode } from "jwt-decode"; import { createContext, useContext, useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; diff --git a/react-ui/src/shared/provider/menu/menu.provider.tsx b/react-ui/src/shared/provider/menu/menu.provider.tsx index a91f46639..b2525692b 100644 --- a/react-ui/src/shared/provider/menu/menu.provider.tsx +++ b/react-ui/src/shared/provider/menu/menu.provider.tsx @@ -1,7 +1,7 @@ import { faRightFromBracket, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { BasicProp } from "@helper/interfaces"; import { useAuth } from "@provider/auth.provider"; +import { BasicProp } from "@shared/types/interfaces.type"; import React, { createContext, useContext, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import './menu.provider.scss'; diff --git a/react-ui/src/shared/provider/utils.provider.tsx b/react-ui/src/shared/provider/utils.provider.tsx index ca6aa1d32..3a76bbe69 100644 --- a/react-ui/src/shared/provider/utils.provider.tsx +++ b/react-ui/src/shared/provider/utils.provider.tsx @@ -1,4 +1,4 @@ -import { BasicProp } from "@helper/interfaces"; +import { BasicProp } from "@shared/types/interfaces.type"; import React, { createContext, useContext, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "react-toastify"; diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index fc5a4b35b..873d7d6a2 100755 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,72 +1,31 @@ -import { debugMessage } from '@helper/debug' import { PayloadAction, createSlice } from '@reduxjs/toolkit' +import { CategoryType } from '@shared/types/category.type' +import { ThunkEntityDTO } from '@shared/types/thunk.type' import { RoutineManager } from '@utils/routine.manager' import { RootState } from '../../stores' import { startListening } from '../../stores/middleware/listener.middleware' import { setToken } from './user.reducer' -// ---------------- thunk types ---------------- - -interface ThunkEntityDTO { - thunk: any - payload: Object - - /** - * Only one subscription per category is allowed. - * New subscription will unsubscribe and overwrite the old one - */ - category: CATEGORIES -} - -/** - * This Wrapper holds the actual thunk information - * as well as additional information - */ -interface ThunkWrapper extends ThunkEntityDTO { - id?: number - locked: boolean -} - -export enum CATEGORIES { - TABLE, - TAB, -} - -// ---------------- reducer types ---------------- - export interface ReducerState { - thunks: { [key in keyof typeof CATEGORIES]: ThunkWrapper | null } + thunks: Record<CategoryType, ThunkEntityDTO | null> } const initialState: ReducerState = { thunks: { + DEVICE: null, TABLE: null, - TAB: null, + TAB: null }, } + const RoutineSlice = createSlice({ name: 'routine', initialState, reducers: { addRoutine: (state: any, { payload }: PayloadAction<ThunkEntityDTO>) => { - if (state.thunks[CATEGORIES[payload.category]]?.locked) { - - } - - const newThunk: ThunkWrapper = { ...payload, locked: true } - state.thunks[CATEGORIES[payload.category]] = newThunk - }, - - setThunkId: (state, { payload }: PayloadAction<{ id: number; category: CATEGORIES }>) => { - const thunk = state.thunks[CATEGORIES[payload.category] as any] - - if (!thunk) { - debugMessage("Desired thunk of category " + payload.category + " is not available") - return - } - - state.thunks[CATEGORIES[payload.category] as any] = { ...thunk, id: payload.id, locked: false } + const newThunk: ThunkEntityDTO = payload + state.thunks[payload.category] = newThunk }, removeAll: (state) => { @@ -113,12 +72,9 @@ startListening({ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const { thunk } = action.payload as ThunkWrapper + const { thunk } = action.payload as ThunkEntityDTO const subscription = await listenerApi.dispatch(thunk(action.payload.payload)) - const thunkId = await RoutineManager.add(subscription.payload) - listenerApi.dispatch( - RoutineSlice.actions.setThunkId({ id: thunkId, category: action.payload.category }) - ) + RoutineManager.add(subscription.payload, action.payload.category) }, }) @@ -127,14 +83,11 @@ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { const { routine } = listenerApi.getOriginalState() as RootState - const lastThunk = routine.thunks[CATEGORIES[action.payload.category] as any] - if (lastThunk) { - if (!lastThunk.id) { - throw new Error() - // TODO - } + const category = action.payload.category; - RoutineManager.unsubscribe(lastThunk.id) + const lastThunk = routine.thunks[category as CategoryType] + if (lastThunk) { + RoutineManager.unsubscribe(category) } }, }) diff --git a/react-ui/src/shared/types/category.type.ts b/react-ui/src/shared/types/category.type.ts new file mode 100644 index 000000000..e08282341 --- /dev/null +++ b/react-ui/src/shared/types/category.type.ts @@ -0,0 +1,17 @@ + +const DeviceListView = { + TABLE: "device_list/table", + TAB: "device_list/tab", +} + +const Shared = { + DEVICE: 'objects/device' +} + + +export const Category = { + ...DeviceListView, + ...Shared +} + +export type CategoryType = keyof typeof Category \ No newline at end of file diff --git a/react-ui/src/shared/helper/interfaces.ts b/react-ui/src/shared/types/interfaces.type.ts similarity index 100% rename from react-ui/src/shared/helper/interfaces.ts rename to react-ui/src/shared/types/interfaces.type.ts diff --git a/react-ui/src/shared/types/thunk.type.ts b/react-ui/src/shared/types/thunk.type.ts new file mode 100644 index 000000000..ef0a92b87 --- /dev/null +++ b/react-ui/src/shared/types/thunk.type.ts @@ -0,0 +1,12 @@ +import { CategoryType } from "./category.type" + +export interface ThunkEntityDTO { + thunk: any + payload: Object + + /** + * Only one subscription per category is allowed. + * New subscription will unsubscribe and overwrite the old one + */ + category: CategoryType +} \ No newline at end of file diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index 2f1a8086a..427043e24 100755 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -1,67 +1,73 @@ +import { infoMessage, warnMessage } from '@helper/debug' import { QueryActionCreatorResult } from '@reduxjs/toolkit/query' +import { Category, CategoryType } from '@shared/types/category.type' type Routine = QueryActionCreatorResult<any> interface Entity { routine: Routine - id: number } -const initialState = { - routines: [] as Entity[], + +interface RoutineState { + routines: Record<CategoryType, Entity | null> +} + +const initalState: RoutineState = { + routines: { + DEVICE: null, + TABLE: null, + TAB: null + } } /** - * Routine manager is a singleton that holds all running routines. - * The redux store holds any persistable information about the routines. - * The routine objects itself are stored in the RoutineManager. - */ +* Routine manager is a singleton that holds all running routines. +* The redux store holds any persistable information about the routines. +* The routine objects itself are stored in the RoutineManager. +*/ export const RoutineManager = (() => { - const state = initialState - const add = (routine: Routine): number => { - const id = state.routines.length + let state = initalState - const newEntity: Entity = { + const add = (routine: Routine, category: CategoryType): boolean => { + const entity: Entity = { routine: routine, - id, } - state.routines = [...state.routines, newEntity] - - return id + state.routines = { + ...state.routines, + [category]: entity + } + return true } const unsubscribeAll = () => { - state.routines.forEach(({ routine: subscription }) => { - _unsubscribe(subscription) - }) + Object.keys(state.routines) + .forEach((category) => { + unsubscribe(category as CategoryType) + }) - state.routines = initialState.routines + state = initalState } /** * @param id * @returns returns true if the routine was stopped, false if it was not found */ - const unsubscribe = (id: number): boolean => { - const routine = state.routines.find(({ id: routineId }) => routineId === id) + const unsubscribe = (category: CategoryType): boolean => { + const entity = state.routines[category] - if (routine) { - _unsubscribe(routine.routine) + if (entity) { + entity.routine.unsubscribe() + state.routines[category] = null + infoMessage("Routine unsubscribed from category " + category) } - return !!routine - } + if (!!entity) { + warnMessage("Desired routine to unsubscribe does not exist in category " + Category[category]) + } - /** - * Actual unsubscribe process. - * This process is extracted to have a single process of unsubscribing. - * - * @param subscription - */ - const _unsubscribe = (subscription: Routine) => { - subscription.unsubscribe() - // TODO remove from state + return !!entity } return { @@ -69,4 +75,4 @@ export const RoutineManager = (() => { unsubscribe, unsubscribeAll, } -})() +})() \ No newline at end of file -- GitLab From 3fb8a29586b34625fea40dc7d61e266c52d12e40 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 8 Jan 2025 15:23:36 +0100 Subject: [PATCH 49/78] (ui): refactor rehydration routine subscriptions --- .../devices/reducer/device.reducer.ts | 26 ++++++--- .../devices/routines/mne.routine.ts | 12 +++-- react-ui/src/index.tsx | 8 +++ react-ui/src/shared/api/user.fetch.ts | 2 +- .../src/shared/reducer/routine.reducer.ts | 54 ++++++++++++------- react-ui/src/shared/types/thunk.type.ts | 26 +++++++-- .../shared/utils/routine-holder.singleton.ts | 47 ++++++++++++++++ react-ui/src/shared/utils/routine.manager.ts | 2 + 8 files changed, 142 insertions(+), 35 deletions(-) create mode 100644 react-ui/src/shared/utils/routine-holder.singleton.ts diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index 9d91700c4..4afcba788 100755 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -45,13 +45,27 @@ const deviceSlice = createSlice({ setActiveTab: (state, action: PayloadAction<DeviceViewTabValues>) => { state.activeTab = action.payload }, - setSelectedDevice: (state, action: PayloadAction<Device | null>) => { - let selectedObject = null; - if (action.payload) { - selectedObject = { device: action.payload, mne: null, json: null } - } + setSelectedDevice: { + reducer: (state, action: PayloadAction<Device | null, string, { skipListener?: boolean }>) => { + // do thing if desired device is already selected + if (state.selected?.device.id === action.payload?.id) { + action.meta.skipListener = true + return + } + + let selectedObject = null; + if (action.payload) { + selectedObject = { device: action.payload, mne: null, json: null } + } - state.selected = selectedObject + state.selected = selectedObject + }, + prepare: (device: Device | null) => { + return { + payload: device, + meta: { skipListener: false } // set to true when needed + } + } }, setSelectedMne: (state, action: PayloadAction<NetworkelementManagedNetworkElement>) => { if (!state.selected) { diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts index a3ea43d2f..876317dd2 100755 --- a/react-ui/src/components/devices/routines/mne.routine.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -7,7 +7,8 @@ import { } from '@component/devices/reducer/device.reducer' import { createAsyncThunk } from '@reduxjs/toolkit' import { addRoutine } from '@shared/reducer/routine.reducer' -import { Category } from '@shared/types/category.type' +import { Category, CategoryType } from '@shared/types/category.type' +import { RoutineHolderSingleton } from '@utils/routine-holder.singleton' import { RootState } from 'src/stores' import { startListening } from '../../../stores/middleware/listener.middleware' @@ -20,13 +21,14 @@ export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE' * Triggered by a selectedDevice */ startListening({ - predicate: (action) => setSelectedDevice.match(action) && !!action.payload, + predicate: (action) => setSelectedDevice.match(action) && !!action.payload && !action.meta?.skipListener, effect: async (action, listenerApi) => { + const factory = RoutineHolderSingleton.getInstance(); listenerApi.dispatch( addRoutine({ - thunk: fetchSelectedMneThunk, - category: Category.TAB, - payload: action.payload, + thunk: factory.getRoutineByName("fetchSelectedMneThunk"), + category: Category.TAB as CategoryType, + payload: action.payload as Object, }) ) }, diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 3697efd07..559e1bc54 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,4 +1,6 @@ +import { fetchSelectedMneThunk } from '@component/devices/routines/mne.routine' import { UtilsProvider } from '@provider/utils.provider' +import { RoutineHolderSingleton } from '@utils/routine-holder.singleton' import i18next from 'i18next' import React from 'react' import ReactDOM from 'react-dom/client' @@ -18,6 +20,12 @@ import { persistor, store } from './stores' window.env = window.location.hostname === 'localhost' ? 'development' : 'production'; +const factory = RoutineHolderSingleton.getInstance(); +factory.registerRoutine("fetchSelectedMneThunk", { + func: fetchSelectedMneThunk, + id: 0 +}); + ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> <ErrorBoundary fallback={<div>Something went wrong</div>}> diff --git a/react-ui/src/shared/api/user.fetch.ts b/react-ui/src/shared/api/user.fetch.ts index 1b6dd344e..08806783b 100644 --- a/react-ui/src/shared/api/user.fetch.ts +++ b/react-ui/src/shared/api/user.fetch.ts @@ -16,7 +16,7 @@ export const fetchUser = createAsyncThunk('user/fetchUser', (_, thunkAPI) => { const matchedUser = response.data.user.find((_user) => _user.name === user.username) if (!matchedUser) { - // TODO proper error handling + // TODO proper error handling => logout throw new Error('No user found with the provided username') } diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index 873d7d6a2..f8c8c31eb 100755 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,13 +1,15 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit' import { CategoryType } from '@shared/types/category.type' -import { ThunkEntityDTO } from '@shared/types/thunk.type' +import { ThunkDTO, ThunkPersist } from '@shared/types/thunk.type' +import { RoutineHolderSingleton } from '@utils/routine-holder.singleton' import { RoutineManager } from '@utils/routine.manager' +import { REHYDRATE } from 'redux-persist' import { RootState } from '../../stores' import { startListening } from '../../stores/middleware/listener.middleware' import { setToken } from './user.reducer' export interface ReducerState { - thunks: Record<CategoryType, ThunkEntityDTO | null> + thunks: Record<CategoryType, ThunkPersist | null> } const initialState: ReducerState = { @@ -23,9 +25,14 @@ const RoutineSlice = createSlice({ name: 'routine', initialState, reducers: { - addRoutine: (state: any, { payload }: PayloadAction<ThunkEntityDTO>) => { - const newThunk: ThunkEntityDTO = payload - state.thunks[payload.category] = newThunk + addRoutine: (state: any, { payload }: PayloadAction<ThunkDTO>) => { + const thunk: ThunkPersist = { + category: payload.category, + payload: payload.payload, + thunkId: payload.thunk.id + } + + state.thunks[payload.category] = thunk }, removeAll: (state) => { @@ -48,19 +55,26 @@ startListening({ // on rehydrate add all persistet routines // TODO -> thunk does not have the thunk function object due to its coming from the store that ignores the value. // at this point we have to figure out how to get the thunk function out of the "string" name -// startListening({ -// predicate: ({ type }) => type === REHYDRATE, -// effect: async (_, listenerApi) => { -// const { routine } = listenerApi.getState() as RootState -// for (const [_, thunk] of Object.entries<ThunkEntity>(routine.thunks)) { -// if (!thunk) { -// continue -// } -// const dto: ThunkEntityDTO = thunk -// listenerApi.dispatch(addRoutine(dto)) -// } -// }, -// }) +startListening({ + predicate: ({ type }) => type === REHYDRATE, + effect: async (_, listenerApi) => { + const { routine } = listenerApi.getState() as RootState + const routines = RoutineHolderSingleton.getInstance() + + Object.values(routine.thunks) + .filter(thunk => !!thunk) + .forEach(thunk => { + const container = routines.getRoutineById(thunk.thunkId) + const dto: ThunkDTO = { + category: thunk.category, + payload: thunk.payload, + thunk: container + } + + listenerApi.dispatch(addRoutine(dto)) + }) + }, +}) /** * Add new routine @@ -72,8 +86,8 @@ startListening({ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { - const { thunk } = action.payload as ThunkEntityDTO - const subscription = await listenerApi.dispatch(thunk(action.payload.payload)) + const { thunk } = action.payload as ThunkDTO + const subscription = await listenerApi.dispatch(thunk.func(action.payload.payload)) RoutineManager.add(subscription.payload, action.payload.category) }, }) diff --git a/react-ui/src/shared/types/thunk.type.ts b/react-ui/src/shared/types/thunk.type.ts index ef0a92b87..90b846039 100644 --- a/react-ui/src/shared/types/thunk.type.ts +++ b/react-ui/src/shared/types/thunk.type.ts @@ -1,7 +1,21 @@ import { CategoryType } from "./category.type" -export interface ThunkEntityDTO { - thunk: any + +/** + * Contains the thunk function combined with a unique id + * Giving a explicit id (and not the index of the object) + * prevents missmatching the function if a update changes + * the RoutineList object length + */ +export interface ThunkContainer { + id: number + func: any, +} + + +export interface ThunkDTO { + thunk: ThunkContainer + payload: Object /** @@ -9,4 +23,10 @@ export interface ThunkEntityDTO { * New subscription will unsubscribe and overwrite the old one */ category: CategoryType -} \ No newline at end of file +} + +export interface ThunkPersist { + thunkId: number, + payload: Object + category: CategoryType +} diff --git a/react-ui/src/shared/utils/routine-holder.singleton.ts b/react-ui/src/shared/utils/routine-holder.singleton.ts new file mode 100644 index 000000000..47332ab0b --- /dev/null +++ b/react-ui/src/shared/utils/routine-holder.singleton.ts @@ -0,0 +1,47 @@ +import { ThunkContainer } from "@shared/types/thunk.type"; + +interface LocalThunkContainer { + container: ThunkContainer, + name: string +} + +export class RoutineHolderSingleton { + private static instance: RoutineHolderSingleton; + private routineList: Array<LocalThunkContainer> = [] + + private constructor() { } + + static getInstance(): RoutineHolderSingleton { + if (!RoutineHolderSingleton.instance) { + RoutineHolderSingleton.instance = new RoutineHolderSingleton(); + } + return RoutineHolderSingleton.instance; + } + + registerRoutine(name: string, thunk: ThunkContainer) { + this.routineList = [...this.routineList, { container: thunk, name }]; + } + + getRoutineById(id: number): ThunkContainer { + const routine = this.routineList.find((thunk) => thunk.container.id === id) + + if (!routine) { + throw new Error('') + // TODO + } + + return routine.container; + } + + + getRoutineByName(name: string): ThunkContainer { + const routine = this.routineList.find((thunk) => thunk.name === name) + + if (!routine) { + throw new Error('') + // TODO + } + + return routine.container; + } +} \ No newline at end of file diff --git a/react-ui/src/shared/utils/routine.manager.ts b/react-ui/src/shared/utils/routine.manager.ts index 427043e24..1fee6723e 100755 --- a/react-ui/src/shared/utils/routine.manager.ts +++ b/react-ui/src/shared/utils/routine.manager.ts @@ -38,6 +38,8 @@ export const RoutineManager = (() => { ...state.routines, [category]: entity } + infoMessage("Routine subscribed to category " + category) + return true } -- GitLab From 94a99354013e460f750fd19a22914cf780f3e63b Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Wed, 8 Jan 2025 16:54:39 +0100 Subject: [PATCH 50/78] (ui): chunked bundles size | improved nginx config | further performance improvements --- react-ui/docker/webserver/Dockerfile | 6 +- react-ui/docker/webserver/nginx.conf | 142 +++++++++--------- react-ui/package.json | 64 ++++---- react-ui/public/fonts/inter-webfont.woff | Bin 0 -> 26796 bytes react-ui/public/fonts/inter-webfont.woff2 | Bin 0 -> 21204 bytes .../components/devices/view/device.view.tsx | 2 +- .../components/login/layouts/login.layout.tsx | 4 +- react-ui/src/routes.tsx | 34 ++++- react-ui/src/shared/icons/icons.ts | 4 +- react-ui/src/shared/style/fonts.scss | 9 +- react-ui/vite.config.mjs | 28 +++- react-ui/yarn.lock | 61 ++++++++ 12 files changed, 232 insertions(+), 122 deletions(-) create mode 100644 react-ui/public/fonts/inter-webfont.woff create mode 100644 react-ui/public/fonts/inter-webfont.woff2 diff --git a/react-ui/docker/webserver/Dockerfile b/react-ui/docker/webserver/Dockerfile index 71127c09b..9c4f3f676 100644 --- a/react-ui/docker/webserver/Dockerfile +++ b/react-ui/docker/webserver/Dockerfile @@ -3,7 +3,11 @@ FROM node:alpine3.20 as builder COPY ./api/openapiv2/gosdn_northbound.swagger.json /app/api/openapiv2/gosdn_northbound.swagger.json COPY ./react-ui /app/react-ui -RUN cd /app/react-ui && yarn && yarn build +RUN cd /app/react-ui && \ + rm -rf node_modules && \ + rm yarn.lock && \ + yarn install --production && \ + yarn build # webserver diff --git a/react-ui/docker/webserver/nginx.conf b/react-ui/docker/webserver/nginx.conf index eb4fc2be9..4ddf7f20d 100644 --- a/react-ui/docker/webserver/nginx.conf +++ b/react-ui/docker/webserver/nginx.conf @@ -1,51 +1,82 @@ - -#user nobody; worker_processes 1; -#error_log logs/error.log; -#error_log logs/error.log notice; -#error_log logs/error.log info; - -#pid logs/nginx.pid; - - events { worker_connections 1024; + multi_accept on; + use epoll; } http { include mime.types; default_type application/octet-stream; - #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - # '$status $body_bytes_sent "$http_referer" ' - # '"$http_user_agent" "$http_x_forwarded_for"'; - - #access_log logs/access.log main; - - sendfile on; - #tcp_nopush on; - - #keepalive_timeout 0; - keepalive_timeout 65; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main buffer=16k; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + server_tokens off; + + # Buffer size settings + client_body_buffer_size 10K; + client_header_buffer_size 1k; + client_max_body_size 8m; + large_client_header_buffers 2 1k; + + # File descriptor cache + open_file_cache max=2000 inactive=20s; + open_file_cache_valid 60s; + open_file_cache_min_uses 5; + open_file_cache_errors off; + + # Compression settings + gzip on; + gzip_comp_level 6; + gzip_min_length 256; + gzip_proxied any; + gzip_vary on; + gzip_types + application/javascript + application/json + application/x-javascript + application/xml + text/css + text/javascript + text/plain + text/xml + text/html + application/x-font-ttf + font/opentype + application/vnd.ms-fontobject + image/svg+xml; resolver 127.0.0.11 ipv6=off; - #gzip on; - server { listen 80; server_name localhost; - #charset koi8-r; - - #access_log logs/host.access.log main; - location ^~ /api/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + + # Proxy timeouts + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + + # Proxy buffering + proxy_buffering on; + proxy_buffer_size 4k; + proxy_buffers 8 16k; # CORS headers add_header 'Access-Control-Allow-Origin' '*' always; @@ -74,59 +105,23 @@ http { try_files $uri $uri/ /index.html; } - location ~* \.(js|css|jpg|png|svg|woff|woff2|ttf|otf|eot|ico)$ { + + # Static asset handling with improved caching + location ~* \.(js|css|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|otf|eot)$ { root /usr/share/nginx/html; - add_header 'Access-Control-Allow-Origin' '*' always; expires 30d; - add_header Cache-Control "public"; + add_header Cache-Control "public, no-transform"; + add_header 'Access-Control-Allow-Origin' '*' always; + + # Enable compression for these files + gzip_static on; # Serve pre-compressed files if available + + # Disable access logs for static files + access_log off; } - - # #error_page 404 /404.html; - - # # redirect server error pages to the static page /50x.html - # # - # error_page 500 502 503 504 /50x.html; - # location = /50x.html { - # root html; - # } - - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} } - # another virtual host using mix of IP-, name-, and port-based configuration - # - #server { - # listen 8000; - # listen somename:8080; - # server_name somename alias another.alias; - - # location / { - # root html; - # index index.html index.htm; - # } - #} # HTTPS server @@ -149,5 +144,4 @@ http { # index index.html index.htm; # } #} - } \ No newline at end of file diff --git a/react-ui/package.json b/react-ui/package.json index 4c9271009..5767007a1 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -13,6 +13,7 @@ "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/react-fontawesome": "^0.2.2", "@reduxjs/toolkit": "^2.2.4", + "@vitejs/plugin-react": "^4.2.1", "bootstrap": "^5.3.3", "dompurify": "^3.2.3", "i18next": "^24.0.5", @@ -24,11 +25,40 @@ "react-i18next": "^15.0.0", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", - "react-scripts": "5.0.1", "react-toastify": "^10.0.5", "redux": "^5.0.1", "redux-observable": "^3.0.0-rc.2", "redux-persist": "^6.0.0", + "sass": "1.82.0", + "sass-embedded": "^1.80.6", + "@fullhuman/postcss-purgecss": "^7.0.2", + "vite": "^6.0.3" + }, + "devDependencies": { + "@babel/runtime": "^7.21.5", + "@rtk-query/codegen-openapi": "^2.0.0", + "@testing-library/jest-dom": "^6.4.8", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", + "eslint": "^9.9.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", + "prettier": "^3.3.3", + "react-scripts": "5.0.1", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.1", + "vite-bundle-visualizer": "^1.2.1", "web-vitals": "^4.2.2" }, "scripts": { @@ -38,7 +68,8 @@ "build": "yarn build::api && yarn build::frontend", "lint": "eslint src", "lint::fix": "eslint src --fix", - "dev": "./scripts/dev.sh" + "dev": "./scripts/dev.sh", + "postbuild": "purgecss --css dist/assets/*.css --content dist/index.html dist/assets/*.js --output dist/purged" }, "eslintConfig": { "extends": [ @@ -56,34 +87,5 @@ "last 1 firefox version", "last 1 safari version" ] - }, - "devDependencies": { - "@babel/runtime": "^7.21.5", - "@rtk-query/codegen-openapi": "^2.0.0", - "@testing-library/jest-dom": "^6.4.8", - "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.5.2", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^8.0.1", - "@typescript-eslint/parser": "^8.0.1", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^9.9.0", - "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.9", - "globals": "^15.9.0", - "prettier": "^3.3.3", - "sass": "1.82.0", - "sass-embedded": "^1.80.6", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", - "vite": "^6.0.3", - "vite-bundle-visualizer": "^1.2.1" } } \ No newline at end of file diff --git a/react-ui/public/fonts/inter-webfont.woff b/react-ui/public/fonts/inter-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..7eca6fe75d3ba56e14981e8f8e1c50d948bb8b56 GIT binary patch literal 26796 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 literal 0 HcmV?d00001 diff --git a/react-ui/public/fonts/inter-webfont.woff2 b/react-ui/public/fonts/inter-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..25ef870d53d5616ee3e92bbe3e85b5ed164fe4d2 GIT binary patch literal 21204 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 Q-fa1H`MqE#XV7g%0OKi>>Hq)$ literal 0 HcmV?d00001 diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 2602463bb..a2c8458a7 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -6,7 +6,7 @@ import './device.scss'; import { DeviceViewTable } from './device.view.table'; import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; -function DeviceView() { +const DeviceView = () => { const { t } = useTranslation('common'); const searchRef = useRef<HTMLInputElement>(null); const { activeTab, setActiveTab, handleActiveTabLink } = useDeviceViewModel(); diff --git a/react-ui/src/components/login/layouts/login.layout.tsx b/react-ui/src/components/login/layouts/login.layout.tsx index 556dc6de4..58e8fc991 100755 --- a/react-ui/src/components/login/layouts/login.layout.tsx +++ b/react-ui/src/components/login/layouts/login.layout.tsx @@ -20,4 +20,6 @@ export const LoginLayout = () => { return ( <LoginView>{outlet}</LoginView> ) -} \ No newline at end of file +} + +export default LoginLayout \ No newline at end of file diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx index 368df55a4..532d03fbf 100755 --- a/react-ui/src/routes.tsx +++ b/react-ui/src/routes.tsx @@ -1,21 +1,43 @@ import { BasicLayout } from "@layout/basic.layout"; import { ProtectedLayout } from "@layout/protected.layout/protected.layout"; +import { lazy, Suspense } from 'react'; import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom"; -import DeviceView from "./components/devices/view/device.view"; -import { LoginLayout } from "./components/login/layouts/login.layout"; export const DEVICE_URL = '/device/'; export const LOGIN_URL = '/login'; +// Lazy load components +const DeviceView = lazy(() => import('./components/devices/view/device.view')); +const LoginLayout = lazy(() => import('./components/login/layouts/login.layout')); + +// Loading fallback component +const LoadingFallback = () => <div>Loading...</div>; export const router = createBrowserRouter( createRoutesFromElements( <Route element={<BasicLayout />}> - <Route path={LOGIN_URL} element={<LoginLayout />} /> + <Route + path={LOGIN_URL} + element={ + <Suspense fallback={<LoadingFallback />}> + <LoginLayout /> + </Suspense> + } + /> <Route element={<ProtectedLayout />}> - <Route path={DEVICE_URL} element={<DeviceView />} /> - <Route path="/" element={<Navigate to={DEVICE_URL} replace={true} />} /> + <Route + path={DEVICE_URL} + element={ + <Suspense fallback={<LoadingFallback />}> + <DeviceView /> + </Suspense> + } + /> + <Route + path="/" + element={<Navigate to={DEVICE_URL} replace={true} />} + /> </Route> </Route> ) -) \ No newline at end of file +); \ No newline at end of file diff --git a/react-ui/src/shared/icons/icons.ts b/react-ui/src/shared/icons/icons.ts index 00021aa11..9c8791cc9 100755 --- a/react-ui/src/shared/icons/icons.ts +++ b/react-ui/src/shared/icons/icons.ts @@ -1,4 +1,4 @@ import { library } from '@fortawesome/fontawesome-svg-core' -import { faSpinner, fas } from '@fortawesome/free-solid-svg-icons' +import { faSpinner } from '@fortawesome/free-solid-svg-icons' -library.add(fas, faSpinner) \ No newline at end of file +library.add(faSpinner) \ No newline at end of file diff --git a/react-ui/src/shared/style/fonts.scss b/react-ui/src/shared/style/fonts.scss index c47d1a52f..3af44e155 100755 --- a/react-ui/src/shared/style/fonts.scss +++ b/react-ui/src/shared/style/fonts.scss @@ -1,9 +1,12 @@ @font-face { font-family: Inter; - src: url("/fonts/Inter.ttf"); + src: + url("/fonts/inter-webfont.woff2") format("woff2"), + url("/fonts/inter-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; } - * { font-family: Inter; -} \ No newline at end of file +} diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index fc4ce4a01..83378d6ee 100755 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -1,13 +1,35 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + export default defineConfig({ plugins: [react()], build: { - sourcemap: true, + sourcemap: false, + + rollupOptions: { + output: { + manualChunks: { + 'required': [ + 'bootstrap', 'react-bootstrap', + 'react', 'react-dom', 'react-router-dom', + 'redux', '@reduxjs/toolkit', 'react-redux', 'redux-observable', 'redux-persist', + 'i18next', 'react-i18next', + '@fortawesome/fontawesome-svg-core', + '@fortawesome/free-regular-svg-icons', + '@fortawesome/free-solid-svg-icons', + '@fortawesome/react-fontawesome' + ], + 'lazy': [ + 'react-toastify' + ] + } + } + } }, // develop server server: { + sourcemap: true, host: true, port: 3000, proxy: { diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index d054db6d6..62e8d8fa1 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -1486,6 +1486,13 @@ dependencies: prop-types "^15.8.1" +"@fullhuman/postcss-purgecss@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@fullhuman/postcss-purgecss/-/postcss-purgecss-7.0.2.tgz#ccacdbc312248c76c42cfac359f4ca5121001e67" + integrity sha512-U4zAXNaVztbDxO9EdcLp51F3UxxYsb/7DN89rFxFJhfk2Wua2pvw2Kf3HdspbPhW/wpHjSjsxWYoIlbTgRSjbQ== + dependencies: + purgecss "^7.0.2" + "@humanfs/core@^0.19.1": version "0.19.1" resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" @@ -3906,6 +3913,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -5690,6 +5702,18 @@ glob@^10.3.10: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" +glob@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e" + integrity sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^4.0.1" + minimatch "^10.0.0" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" + glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -6469,6 +6493,13 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.0.2.tgz#11f9468a3730c6ff6f56823a820d7e3be9bef015" + integrity sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw== + dependencies: + "@isaacs/cliui" "^8.0.2" + jake@^10.8.5: version "10.9.2" resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" @@ -7277,6 +7308,11 @@ lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.0.0: + version "11.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" + integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7407,6 +7443,13 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -7923,6 +7966,14 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + path-to-regexp@0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" @@ -8653,6 +8704,16 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +purgecss@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-7.0.2.tgz#b7dccc3ead65a4301eed98e014793719a511c633" + integrity sha512-4Ku8KoxNhOWi9X1XJ73XY5fv+I+hhTRedKpGs/2gaBKU8ijUiIKF/uyyIyh7Wo713bELSICF5/NswjcuOqYouQ== + dependencies: + commander "^12.1.0" + glob "^11.0.0" + postcss "^8.4.47" + postcss-selector-parser "^6.1.2" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -- GitLab From 0f29973e06502fdd2cfe36b95cba961dba466205 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Thu, 9 Jan 2025 13:17:49 +0100 Subject: [PATCH 51/78] (ui): reduced complexity of rehydration process --- .../devices/reducer/device.reducer.ts | 58 +++++++++++++++---- .../devices/routines/device.routine.ts | 2 +- .../devices/routines/mne.routine.ts | 12 ++-- .../view_model/device.table.viewmodel.ts | 2 +- react-ui/src/index.tsx | 8 --- .../src/shared/reducer/routine.reducer.ts | 35 +++-------- react-ui/src/shared/types/thunk.type.ts | 15 +---- .../shared/utils/routine-holder.singleton.ts | 47 --------------- 8 files changed, 65 insertions(+), 114 deletions(-) delete mode 100644 react-ui/src/shared/utils/routine-holder.singleton.ts diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index 4afcba788..cea12fbc9 100755 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -5,6 +5,7 @@ import { } from '@api/api' import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs' import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import { REHYDRATE } from 'redux-persist' import { RootState } from 'src/stores' import '../routines/index' import { startListening } from '/src/stores/middleware/listener.middleware' @@ -32,6 +33,13 @@ const initialState: DeviceSliceState = { selected: null, } +interface SetSelectedDeviceType { + device: Device | null, + options?: { + bypassCheck: boolean + } +} + const deviceSlice = createSlice({ name: 'device', initialState, @@ -46,24 +54,33 @@ const deviceSlice = createSlice({ state.activeTab = action.payload }, setSelectedDevice: { - reducer: (state, action: PayloadAction<Device | null, string, { skipListener?: boolean }>) => { - // do thing if desired device is already selected - if (state.selected?.device.id === action.payload?.id) { - action.meta.skipListener = true + reducer: (state, { payload, meta }: PayloadAction<SetSelectedDeviceType, string, { skipListener?: boolean }>) => { + /** + * Do nothing if desired device is already selected + * Bypass the check if the flag is set to true. We + * use this bypass to trigger the listener functions + * accordingly + */ + if (!payload?.options?.bypassCheck && state.selected?.device.id === payload.device?.id) { + meta.skipListener = true return } - let selectedObject = null; - if (action.payload) { - selectedObject = { device: action.payload, mne: null, json: null } + if (!payload.device) { + throw Error('Passed null device as parameter while bypassing the safety check') + } + + let selectedObject: SelectedObject | null = null; + if (payload) { + selectedObject = { device: payload.device, mne: null, json: null } } state.selected = selectedObject }, - prepare: (device: Device | null) => { + prepare: (payload) => { return { - payload: device, - meta: { skipListener: false } // set to true when needed + payload, + meta: { skipListener: false } } } }, @@ -107,7 +124,24 @@ startListening({ } // if there are no devices available do set null - const newDevices = action.payload?.[0] || null - listenerApi.dispatch(setSelectedDevice(newDevices)) + const device = action.payload?.[0] || null + listenerApi.dispatch(setSelectedDevice({ device } as SetSelectedDeviceType)) }, }) + + +/** + * On startup reset the selected device + */ +startListening({ + predicate: ({ type }: any) => type === REHYDRATE, + effect: async (_, listenerApi) => { + const { device: state } = listenerApi.getState() as RootState + const device = state.selected?.device + if (!device) { + return + } + + listenerApi.dispatch(setSelectedDevice({ device, options: { bypassCheck: true } } as SetSelectedDeviceType)) + }, +}) \ No newline at end of file diff --git a/react-ui/src/components/devices/routines/device.routine.ts b/react-ui/src/components/devices/routines/device.routine.ts index f9b3e1ee2..ef92b1c8e 100755 --- a/react-ui/src/components/devices/routines/device.routine.ts +++ b/react-ui/src/components/devices/routines/device.routine.ts @@ -20,7 +20,7 @@ export const fetchDevicesThunk = createAsyncThunk(FETCH_DEVICE_ACTION, (_, thunk const { user } = thunkApi.getState() as RootState if (!user.user?.roles) { - throw new Error('Background MNE fetching failed! User data is missing. Reload page or logout and login again') + throw new Error('Background device fetching failed! User data is missing. Reload page or logout and login again') // TODO } diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts index 876317dd2..292869307 100755 --- a/react-ui/src/components/devices/routines/mne.routine.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -8,12 +8,12 @@ import { import { createAsyncThunk } from '@reduxjs/toolkit' import { addRoutine } from '@shared/reducer/routine.reducer' import { Category, CategoryType } from '@shared/types/category.type' -import { RoutineHolderSingleton } from '@utils/routine-holder.singleton' import { RootState } from 'src/stores' import { startListening } from '../../../stores/middleware/listener.middleware' export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE' + /** * #0 * Trigger fetch MNE (#1) @@ -21,14 +21,16 @@ export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE' * Triggered by a selectedDevice */ startListening({ - predicate: (action) => setSelectedDevice.match(action) && !!action.payload && !action.meta?.skipListener, + predicate: (action) => setSelectedDevice.match(action) && !!action.payload.device && !action.meta?.skipListener, effect: async (action, listenerApi) => { - const factory = RoutineHolderSingleton.getInstance(); + + const device = action.payload.device + listenerApi.dispatch( addRoutine({ - thunk: factory.getRoutineByName("fetchSelectedMneThunk"), + thunk: fetchSelectedMneThunk, category: Category.TAB as CategoryType, - payload: action.payload as Object, + payload: device, }) ) }, diff --git a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts index df7595328..5769780ff 100755 --- a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts @@ -26,7 +26,7 @@ export const useDeviceTableViewModel = (searchRef) => { }, []); const trClickHandler = (device: Device) => { - dispatch(setSelectedDevice(device)); + dispatch(setSelectedDevice({ device })); } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 559e1bc54..3697efd07 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,6 +1,4 @@ -import { fetchSelectedMneThunk } from '@component/devices/routines/mne.routine' import { UtilsProvider } from '@provider/utils.provider' -import { RoutineHolderSingleton } from '@utils/routine-holder.singleton' import i18next from 'i18next' import React from 'react' import ReactDOM from 'react-dom/client' @@ -20,12 +18,6 @@ import { persistor, store } from './stores' window.env = window.location.hostname === 'localhost' ? 'development' : 'production'; -const factory = RoutineHolderSingleton.getInstance(); -factory.registerRoutine("fetchSelectedMneThunk", { - func: fetchSelectedMneThunk, - id: 0 -}); - ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> <ErrorBoundary fallback={<div>Something went wrong</div>}> diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index f8c8c31eb..5e9c3401a 100755 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -1,9 +1,7 @@ import { PayloadAction, createSlice } from '@reduxjs/toolkit' import { CategoryType } from '@shared/types/category.type' import { ThunkDTO, ThunkPersist } from '@shared/types/thunk.type' -import { RoutineHolderSingleton } from '@utils/routine-holder.singleton' import { RoutineManager } from '@utils/routine.manager' -import { REHYDRATE } from 'redux-persist' import { RootState } from '../../stores' import { startListening } from '../../stores/middleware/listener.middleware' import { setToken } from './user.reducer' @@ -52,30 +50,6 @@ startListening({ }, }) -// on rehydrate add all persistet routines -// TODO -> thunk does not have the thunk function object due to its coming from the store that ignores the value. -// at this point we have to figure out how to get the thunk function out of the "string" name -startListening({ - predicate: ({ type }) => type === REHYDRATE, - effect: async (_, listenerApi) => { - const { routine } = listenerApi.getState() as RootState - const routines = RoutineHolderSingleton.getInstance() - - Object.values(routine.thunks) - .filter(thunk => !!thunk) - .forEach(thunk => { - const container = routines.getRoutineById(thunk.thunkId) - const dto: ThunkDTO = { - category: thunk.category, - payload: thunk.payload, - thunk: container - } - - listenerApi.dispatch(addRoutine(dto)) - }) - }, -}) - /** * Add new routine * @@ -87,12 +61,17 @@ startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { const { thunk } = action.payload as ThunkDTO - const subscription = await listenerApi.dispatch(thunk.func(action.payload.payload)) + const subscription = await listenerApi.dispatch(thunk(action.payload.payload)) + + if (subscription.error) { + throw new Error('Error during routine execution: ' + subscription.error.message) + } + RoutineManager.add(subscription.payload, action.payload.category) }, }) -// unsubscribe old routine +// unsubscribe old routine that is in the same category startListening({ predicate: (action) => addRoutine.match(action), effect: async (action, listenerApi) => { diff --git a/react-ui/src/shared/types/thunk.type.ts b/react-ui/src/shared/types/thunk.type.ts index 90b846039..9143871f0 100644 --- a/react-ui/src/shared/types/thunk.type.ts +++ b/react-ui/src/shared/types/thunk.type.ts @@ -1,21 +1,12 @@ import { CategoryType } from "./category.type" -/** - * Contains the thunk function combined with a unique id - * Giving a explicit id (and not the index of the object) - * prevents missmatching the function if a update changes - * the RoutineList object length - */ -export interface ThunkContainer { - id: number - func: any, -} +// The actual Thunk type is hard to determine because is very generic +export type ThunkFunc = any export interface ThunkDTO { - thunk: ThunkContainer - + thunk: ThunkFunc payload: Object /** diff --git a/react-ui/src/shared/utils/routine-holder.singleton.ts b/react-ui/src/shared/utils/routine-holder.singleton.ts deleted file mode 100644 index 47332ab0b..000000000 --- a/react-ui/src/shared/utils/routine-holder.singleton.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ThunkContainer } from "@shared/types/thunk.type"; - -interface LocalThunkContainer { - container: ThunkContainer, - name: string -} - -export class RoutineHolderSingleton { - private static instance: RoutineHolderSingleton; - private routineList: Array<LocalThunkContainer> = [] - - private constructor() { } - - static getInstance(): RoutineHolderSingleton { - if (!RoutineHolderSingleton.instance) { - RoutineHolderSingleton.instance = new RoutineHolderSingleton(); - } - return RoutineHolderSingleton.instance; - } - - registerRoutine(name: string, thunk: ThunkContainer) { - this.routineList = [...this.routineList, { container: thunk, name }]; - } - - getRoutineById(id: number): ThunkContainer { - const routine = this.routineList.find((thunk) => thunk.container.id === id) - - if (!routine) { - throw new Error('') - // TODO - } - - return routine.container; - } - - - getRoutineByName(name: string): ThunkContainer { - const routine = this.routineList.find((thunk) => thunk.name === name) - - if (!routine) { - throw new Error('') - // TODO - } - - return routine.container; - } -} \ No newline at end of file -- GitLab From 1d4f07bb5d79c91b59cf2d32b5c842937305f360 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Thu, 9 Jan 2025 14:02:32 +0100 Subject: [PATCH 52/78] (ui): add highlight on search in table --- .../src/components/devices/api/pnd.fetch.ts | 15 ---------- .../devices/view/device.view.table.tsx | 30 ++++++++++++------- .../json_viewer/view/json_viewer.view.tsx | 8 +---- react-ui/src/shared/helper/text.ts | 12 ++++++++ .../protected.layout/protected.layout.tsx | 3 +- .../user.fetch.ts => routine/user.routine.ts} | 14 ++++++++- 6 files changed, 46 insertions(+), 36 deletions(-) delete mode 100644 react-ui/src/components/devices/api/pnd.fetch.ts create mode 100644 react-ui/src/shared/helper/text.ts rename react-ui/src/shared/{api/user.fetch.ts => routine/user.routine.ts} (63%) diff --git a/react-ui/src/components/devices/api/pnd.fetch.ts b/react-ui/src/components/devices/api/pnd.fetch.ts deleted file mode 100644 index fd49de636..000000000 --- a/react-ui/src/components/devices/api/pnd.fetch.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { PndServiceGetPndListApiArg, api } from "@api/api" -import { createAsyncThunk } from "@reduxjs/toolkit" -import { setPnds } from "../reducer/device.reducer" - -// TODO rethink this. This should be in the shared part bc its getting invoked in the procteded layout -export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { - const payload: PndServiceGetPndListApiArg = { - timestamp: new Date().getTime().toString(), - } - - const subscription = thunkApi.dispatch(api.endpoints.pndServiceGetPndList.initiate(payload)) - subscription.unwrap().then((response) => { - thunkApi.dispatch(setPnds(response.pnd)) - }) -}) \ No newline at end of file diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index 9b731fef5..337148f92 100755 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -1,4 +1,6 @@ +import { insertMarkTags } from "@helper/text"; import { useAppSelector } from "@hooks"; +import DOMPurify from 'dompurify'; import { MutableRefObject, useCallback } from "react"; import { OverlayTrigger, Table, Tooltip } from "react-bootstrap"; import { useTranslation } from "react-i18next"; @@ -15,25 +17,30 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = } const getDeviceTable = useCallback(() => { - return devices.filter((device) => { - if (!searchRef.current?.value) { - return true; - } + const search = searchRef.current?.value; + let filtered = devices - const searchInput = searchRef.current!.value; - const user = pnds.find(pnd => pnd.id === device.pid); + // filter if something is in search + if (search) { + filtered = devices.filter((device) => { + const user = pnds.find(pnd => pnd.id === device.pid); + + return device.id?.includes(search) || + device.name?.includes(search) || + user?.name?.includes(search); + }) + } - return device.id.includes(searchInput) || device.name.includes(searchInput) || user?.name.includes(searchInput); - }).map((device, index) => { + return filtered.map((device, index) => { const user = pnds.find(pnd => pnd.id === device.pid); return ( <tr key={index} onClick={() => trClickHandler(device)} className={selectedDevice?.device.id === device.id ? 'active' : ''}> - <td>{device.name}</td> + <td key={0} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(device.name!, search) : DOMPurify.sanitize(device.name) }}></td> <OverlayTrigger overlay={<Tooltip id={device.id}>{device.id}</Tooltip>}> - <td>{cropUUID(device.id)}</td> + <td dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(cropUUID(device.id!), search) : DOMPurify.sanitize(cropUUID(device.id!)) }}></td> </OverlayTrigger> - <td>{user?.name || ''}</td> + <td key={1} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(user?.name || '', search) : DOMPurify.sanitize(user?.name || '') }}></td> <td></td> </tr> ) @@ -41,6 +48,7 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = }, [devices, searchRef, pnds, selectedDevice, trClickHandler]); + return ( <Table striped responsive className="device-table"> <thead> diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index b8358c686..33e52a397 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -1,5 +1,6 @@ import { faAlignRight, faPenToSquare, faTrashCan } from "@fortawesome/free-solid-svg-icons" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" +import { insertMarkTags } from "@helper/text" import DOMPurify from 'dompurify' import React, { Suspense, useMemo, useRef } from "react" import { Form, Table } from "react-bootstrap" @@ -30,13 +31,6 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { ) }, [breadcrumbs]) - const insertMarkTags = (text: string, search: string): string => { - const start = text.indexOf(search) - const end = start + search.length - - return DOMPurify.sanitize(text.substring(0, start)) + "<span class='highlight'>" + DOMPurify.sanitize(search) + "</span>" + DOMPurify.sanitize(text.substring(end, text.length)) - } - const renderInner = (innerJson: JSON, nested: number = 0, parentKey: string = "", path: string = "/network-instance/0/"): JSX.Element => { path += parentKey + (parentKey === "" ? "" : "/") diff --git a/react-ui/src/shared/helper/text.ts b/react-ui/src/shared/helper/text.ts new file mode 100644 index 000000000..6aee13790 --- /dev/null +++ b/react-ui/src/shared/helper/text.ts @@ -0,0 +1,12 @@ + +import DOMPurify from 'dompurify' + +export const insertMarkTags = (text: string, search: string): string => { + const start = text.indexOf(search) + if (start === -1) { + return DOMPurify.sanitize(text) + } + const end = start + search.length + + return DOMPurify.sanitize(text.substring(0, start)) + "<span class='highlight'>" + DOMPurify.sanitize(search) + "</span>" + DOMPurify.sanitize(text.substring(end, text.length)) +} \ No newline at end of file diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 17b6209a5..b017cf56f 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -1,12 +1,11 @@ -import { fetchUser } from '@api/user.fetch'; import logo from '@assets/logo.svg'; -import { fetchPnds } from '@component/devices/api/pnd.fetch'; import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useAppDispatch, useAppSelector } from '@hooks'; import { useAuth } from "@provider/auth.provider"; import { MenuProvider } from '@provider/menu/menu.provider'; import { DEVICE_URL, LOGIN_URL } from '@routes'; +import { fetchPnds, fetchUser } from '@shared/routine/user.routine'; import React, { useEffect } from "react"; import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; diff --git a/react-ui/src/shared/api/user.fetch.ts b/react-ui/src/shared/routine/user.routine.ts similarity index 63% rename from react-ui/src/shared/api/user.fetch.ts rename to react-ui/src/shared/routine/user.routine.ts index 08806783b..368ccf412 100644 --- a/react-ui/src/shared/api/user.fetch.ts +++ b/react-ui/src/shared/routine/user.routine.ts @@ -1,7 +1,8 @@ +import { api, PndServiceGetPndListApiArg, UserServiceGetUsersApiArg } from "@api/api" +import { setPnds } from "@component/devices/reducer/device.reducer" import { createAsyncThunk } from "@reduxjs/toolkit" import { setUser } from "@shared/reducer/user.reducer" import { RootState } from "src/stores" -import { api, UserServiceGetUsersApiArg } from "./api" export const fetchUser = createAsyncThunk('user/fetchUser', (_, thunkAPI) => { const payload: UserServiceGetUsersApiArg = {} @@ -23,3 +24,14 @@ export const fetchUser = createAsyncThunk('user/fetchUser', (_, thunkAPI) => { thunkAPI.dispatch(setUser(matchedUser)) }) }) + +export const fetchPnds = createAsyncThunk('device/fetchPnds', (_, thunkApi) => { + const payload: PndServiceGetPndListApiArg = { + timestamp: new Date().getTime().toString(), + } + + const subscription = thunkApi.dispatch(api.endpoints.pndServiceGetPndList.initiate(payload)) + subscription.unwrap().then((response) => { + thunkApi.dispatch(setPnds(response.pnd)) + }) +}) \ No newline at end of file -- GitLab From 24ce36861a015658715bde1cf388b287fc100926 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Thu, 9 Jan 2025 18:35:57 +0100 Subject: [PATCH 53/78] (ui): add copy and copy row menu options --- react-ui/package.json | 5 +- .../devices/view/device.view.table.tsx | 35 ++++---- .../view_model/device.table.viewmodel.ts | 84 +++++++++++++++++-- .../src/i18n/locales/en/translations.json | 7 +- .../viewmodel/json_viewer.viewmodel.tsx | 45 +++++----- .../shared/provider/menu/menu.provider.tsx | 43 ++++++---- react-ui/yarn.lock | 5 ++ 7 files changed, 162 insertions(+), 62 deletions(-) diff --git a/react-ui/package.json b/react-ui/package.json index 5767007a1..30db7c97c 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -12,9 +12,11 @@ "@fortawesome/free-regular-svg-icons": "^6.6.0", "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/react-fontawesome": "^0.2.2", + "@fullhuman/postcss-purgecss": "^7.0.2", "@reduxjs/toolkit": "^2.2.4", "@vitejs/plugin-react": "^4.2.1", "bootstrap": "^5.3.3", + "crypto-js": "^4.2.0", "dompurify": "^3.2.3", "i18next": "^24.0.5", "jwt-decode": "^4.0.0", @@ -31,7 +33,6 @@ "redux-persist": "^6.0.0", "sass": "1.82.0", "sass-embedded": "^1.80.6", - "@fullhuman/postcss-purgecss": "^7.0.2", "vite": "^6.0.3" }, "devDependencies": { @@ -88,4 +89,4 @@ "last 1 safari version" ] } -} \ No newline at end of file +} diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index 337148f92..56ad05f3f 100755 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -1,20 +1,20 @@ import { insertMarkTags } from "@helper/text"; import { useAppSelector } from "@hooks"; import DOMPurify from 'dompurify'; -import { MutableRefObject, useCallback } from "react"; +import { MutableRefObject, useCallback, useRef } from "react"; import { OverlayTrigger, Table, Tooltip } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { useDeviceTableViewModel } from "../view_model/device.table.viewmodel"; +const cropUUID = (uuid: string): string => { + return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); +} + export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { const { devices, pnds, selected: selectedDevice } = useAppSelector(state => state.device); const { t } = useTranslation('common'); - const { trClickHandler } = useDeviceTableViewModel(searchRef); - - - const cropUUID = (uuid: string): string => { - return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); - } + const tableRef = useRef(); + const { trClickHandler } = useDeviceTableViewModel(searchRef, tableRef); const getDeviceTable = useCallback(() => { const search = searchRef.current?.value; @@ -34,23 +34,28 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = return filtered.map((device, index) => { const user = pnds.find(pnd => pnd.id === device.pid); + const username = user?.name || '' + const deviceId = device.id!; + const cropedId = cropUUID(deviceId) + const devicename = device.name || ''; + + const rowData = username + ";" + deviceId + ";" + devicename + return ( - <tr key={index} onClick={() => trClickHandler(device)} className={selectedDevice?.device.id === device.id ? 'active' : ''}> - <td key={0} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(device.name!, search) : DOMPurify.sanitize(device.name) }}></td> - <OverlayTrigger overlay={<Tooltip id={device.id}>{device.id}</Tooltip>}> - <td dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(cropUUID(device.id!), search) : DOMPurify.sanitize(cropUUID(device.id!)) }}></td> + <tr data-copy-value={rowData} key={index} onClick={() => trClickHandler(device)} className={selectedDevice?.device.id === deviceId ? 'active' : ''}> + <td data-copy-value={devicename} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(devicename, search) : DOMPurify.sanitize(devicename) }}></td> + <OverlayTrigger overlay={<Tooltip id={device.id}>{deviceId}</Tooltip>}> + <td data-copy-value={deviceId} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(cropedId, search) : DOMPurify.sanitize(cropedId) }}></td> </OverlayTrigger> - <td key={1} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(user?.name || '', search) : DOMPurify.sanitize(user?.name || '') }}></td> + <td data-copy-value={username} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) }}></td> <td></td> </tr> ) }) }, [devices, searchRef, pnds, selectedDevice, trClickHandler]); - - return ( - <Table striped responsive className="device-table"> + <Table striped responsive className="device-table" ref={tableRef}> <thead> <tr> <th>{t('device.table.header.name')}</th> diff --git a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts index 5769780ff..4b328d639 100755 --- a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts @@ -1,29 +1,97 @@ import { Device, setSelectedDevice } from "@component/devices/reducer/device.reducer"; +import { faCopy } from "@fortawesome/free-solid-svg-icons"; import { useAppDispatch } from "@hooks"; +import { useMenu } from "@provider/menu/menu.provider"; +import { useUtils } from "@provider/utils.provider"; import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { toast } from "react-toastify"; -export const useDeviceTableViewModel = (searchRef) => { +export const useDeviceTableViewModel = (searchRef, tableRef) => { const [searchTerm, setSearchTerm] = useState(''); const dispatch = useAppDispatch(); + const { subscribe } = useMenu(); + const { toClipboard } = useUtils(); + const { t } = useTranslation('common'); + + + const registerMenuOptions = () => { + const subscription = subscribe({ + target: tableRef.current, + actions: [ + { + key: t('device.table.actions.copy'), + icon: faCopy, + action: (clickedElement) => { + if (clickedElement) { + const text = clickedElement.dataset.copyValue + if (!text) { + toast.warn(t('global.toast.copied_failed')) + return + } + + + toClipboard(text) + } + } + }, + + { + key: t('device.table.actions.copy_row'), + icon: faCopy, + action: (clickedElement) => { + let parent = clickedElement; + while (parent && parent.tagName !== 'TR') { + parent = parent.parentNode; + } + + const text = parent.dataset.copyValue + if (!text) { + toast.warn(t('global.toast.copied_failed')) + return + } + toClipboard(text) + } + } + ] + }) + + return () => { + subscription.unsubscribe() + } + } + + // seperate use effect to rerun this after tableref and subscribe are initialized + useEffect(() => { + if (!subscribe || !tableRef.current) { + return + } + + const unsubscribe = registerMenuOptions() + + return () => { + unsubscribe() + } + }, [tableRef, subscribe]) useEffect(() => { + if (!searchRef.current) { + return + } + const handleSearchChange = () => { - if (searchRef.current) { - setSearchTerm(searchRef.current.value); - } + setSearchTerm(searchRef.current.value); }; - if (searchRef.current) { - searchRef.current.addEventListener('input', handleSearchChange); - } + searchRef.current.addEventListener('input', handleSearchChange); return () => { if (searchRef.current) { searchRef.current.removeEventListener('input', handleSearchChange); } }; - }, []); + }, [searchRef]); const trClickHandler = (device: Device) => { dispatch(setSelectedDevice({ device })); diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index 46b76563c..fb3ca729c 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -6,7 +6,8 @@ "empty_field": "This field can´t be empty" }, "toast": { - "copied": "Copied to clipboard" + "copied": "Copied to clipboard", + "copied_failed": "Copying to clipboard failed" }, "menu_item": { "logout": "Logout" @@ -35,6 +36,10 @@ "uuid": "UUID", "user": "User", "last_updated": "Last updated" + }, + "actions": { + "copy": "Copy", + "copy_row": "Copy row" } }, "search": { diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index 6c3ac78f3..f0bc92212 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -67,29 +67,31 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy } const registerMenuOptions = () => { - if (container.current) { - const subscription = subscribe({ - target: container.current, - actions: [ - { - key: t('json_viewer.copy'), - icon: faCopy, - action: (clickedElement) => { - let parent = clickedElement; - while (parent && parent.tagName !== 'TR') { - parent = parent.parentNode; - } - - const copyValue = parent.dataset.copyValue - toClipboard(copyValue) + if (!container.current) { + return () => { } + } + + const subscription = subscribe({ + target: container.current, + actions: [ + { + key: t('json_viewer.copy'), + icon: faCopy, + action: (clickedElement) => { + let parent = clickedElement; + while (parent && parent.tagName !== 'TR') { + parent = parent.parentNode; } + + const copyValue = parent.dataset.copyValue + toClipboard(copyValue) } - ] - }) + } + ] + }) - return () => { - subscription.unsubscribe(); - } + return () => { + subscription.unsubscribe(); } } @@ -137,7 +139,7 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy }, [searchTerm]) useEffect(() => { - registerMenuOptions(); + const unsubscribe = registerMenuOptions(); if (search.current) { search.current.addEventListener('input', handleSearchInput) @@ -147,6 +149,7 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy if (search.current) { search.current.removeEventListener('input', handleSearchInput) } + unsubscribe() } }, []) diff --git a/react-ui/src/shared/provider/menu/menu.provider.tsx b/react-ui/src/shared/provider/menu/menu.provider.tsx index b2525692b..f3af8e5c1 100644 --- a/react-ui/src/shared/provider/menu/menu.provider.tsx +++ b/react-ui/src/shared/provider/menu/menu.provider.tsx @@ -19,13 +19,11 @@ type Action = { } interface MenuProviderType { - subscribe: (value: SubscriptionValue) => MenuSubscription + subscribe: ((value: SubscriptionValue) => MenuSubscription) | null; } const MenuContext = createContext<MenuProviderType>({ - subscribe: function (): MenuSubscription { - throw new Error("Function not implemented."); - } + subscribe: null }) interface SubscriptionValue { @@ -33,11 +31,16 @@ interface SubscriptionValue { actions: Array<Action> } +interface SubscriptionMap { + [id: string]: SubscriptionValue +} + export const MenuProvider: React.FC<BasicProp> = ({ children }) => { const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 }); const [showMenu, setShowMenu] = useState(false); - const [subscribedTargets, setSubscribedTargets] = useState<Array<SubscriptionValue>>([]) + const [subscribedTargets, setSubscribedTargets] = useState<SubscriptionMap>({}); + const { logout } = useAuth() const { t } = useTranslation('common') @@ -61,12 +64,15 @@ export const MenuProvider: React.FC<BasicProp> = ({ children }) => { const handleContextMenu = (event: React.MouseEvent<HTMLElement>) => { event.preventDefault(); - const targets = subscribedTargets.filter(({ target }) => target.contains(event.target as HTMLElement)) + + const targets = Object.values(subscribedTargets).filter( + ({ target }) => target.contains(event.target as HTMLElement) + ); setMenuPosition({ top: event.pageY, left: event.pageX }); - setMenuItems(targets) - setClickedHtmlElement(event.target as HTMLElement) - displayMenu() + setMenuItems(targets); + setClickedHtmlElement(event.target as HTMLElement); + displayMenu(); }; const displayMenu = () => { @@ -90,20 +96,27 @@ export const MenuProvider: React.FC<BasicProp> = ({ children }) => { const value = useMemo<MenuProviderType>(() => { return { - subscribe(target) { - const index = subscribedTargets.length; + subscribe(target: SubscriptionValue) { + const subscriptionId = crypto.randomUUID(); // Generate unique ID - setSubscribedTargets([...subscribedTargets, target]) + setSubscribedTargets(prev => ({ + ...prev, + [subscriptionId]: target + })); const subscription: MenuSubscription = { unsubscribe() { - setSubscribedTargets([...subscribedTargets.splice(index, 1)]) + setSubscribedTargets(prev => { + const next = { ...prev }; + delete next[subscriptionId]; + return next; + }); }, } - return subscription + return subscription; }, } as MenuProviderType - }, []) + }, []); return ( <MenuContext.Provider value={value}> diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 62e8d8fa1..ec57231a8 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -4073,6 +4073,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" -- GitLab From e7b00ce2e142099a77141e3dcd9f5b7574a46aa3 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Thu, 9 Jan 2025 18:42:37 +0100 Subject: [PATCH 54/78] (ui): increase nginx buffer size --- react-ui/docker/webserver/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/react-ui/docker/webserver/nginx.conf b/react-ui/docker/webserver/nginx.conf index 4ddf7f20d..b9028bec3 100644 --- a/react-ui/docker/webserver/nginx.conf +++ b/react-ui/docker/webserver/nginx.conf @@ -25,9 +25,9 @@ http { # Buffer size settings client_body_buffer_size 10K; - client_header_buffer_size 1k; + client_header_buffer_size 8k; client_max_body_size 8m; - large_client_header_buffers 2 1k; + large_client_header_buffers 4 8k; # File descriptor cache open_file_cache max=2000 inactive=20s; -- GitLab From a19374fd77e884cfe7f1a99633fefe8e7838953f Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Thu, 9 Jan 2025 18:48:33 +0100 Subject: [PATCH 55/78] (ui): refactor assets --- react-ui/assets/logo.svg | 17 ----------------- react-ui/index.html | 5 +++-- react-ui/public/favicon.ico | Bin 3870 -> 31533 bytes .../protected.layout/protected.layout.tsx | 2 +- react-ui/tsconfig.json | 1 - react-ui/vite.config.mjs | 1 - 6 files changed, 4 insertions(+), 22 deletions(-) delete mode 100755 react-ui/assets/logo.svg mode change 100755 => 100644 react-ui/public/favicon.ico diff --git a/react-ui/assets/logo.svg b/react-ui/assets/logo.svg deleted file mode 100755 index b7f71bd90..000000000 --- a/react-ui/assets/logo.svg +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with Vectornator (http://vectornator.io/) --> -<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 113.4 212.625" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:vectornator="http://vectornator.io" xmlns:xlink="http://www.w3.org/1999/xlink"> -<defs> -<radialGradient cx="170.235" cy="146.046" gradientTransform="matrix(1.00001 -8.65109e-05 8.65119e-05 1 -115.465 -116.986)" gradientUnits="userSpaceOnUse" id="RadialGradient" r="217.591"> -<stop offset="0" stop-color="#c456f7"/> -<stop offset="1" stop-color="#34054a"/> -</radialGradient> -<filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="209.692" id="Filter" width="111.957" x="0.722269" y="2.46642"> -<feDropShadow dx="-4.37114e-08" dy="1" flood-color="#050505" flood-opacity="1" in="SourceGraphic" result="Shadow" stdDeviation="1"/> -</filter> -</defs> -<g id="Layer-1" vectornator:layerName="Layer 1"> -<path d="M35.1413 3.47016L35.1416 6.93891L27.1415 6.93961L27.1464 63.3771C21.6096 65.0011 16.4869 67.0445 12.2717 69.6596C-9.35807 83.0789 12.5182 123.232 12.5264 123.222C12.5341 123.213 12.5498 123.2 12.5576 123.191C13.1518 124.609 14.5144 125.761 16.5579 126.534C18.7737 127.372 21.8204 127.855 26.8082 128.408C25.0644 132.318 24.4639 137.732 25.3409 144.846C26.0816 150.854 28.2327 155.309 32.5924 161.533C32.9615 162.06 34.1761 163.796 34.3427 164.033C35.013 164.984 35.5416 165.705 35.9991 166.408C38.1084 169.647 39.1319 172.149 39.3124 174.814C39.3701 175.665 39.3355 180.513 39.251 187.751C39.2362 189.024 39.0999 200.614 39.0959 200.907C37.7122 201.653 36.7523 203.069 36.7525 204.751C36.7527 207.19 38.7205 209.157 41.1591 209.157C43.5978 209.157 45.5653 207.189 45.5651 204.751C45.5649 203.019 44.5477 201.568 43.096 200.844C43.1023 200.341 43.2363 189.045 43.2511 187.782C43.3388 180.268 43.3816 175.583 43.3124 174.563C43.0775 171.096 41.7912 168.012 39.3427 164.251C38.854 163.5 38.3197 162.708 37.6237 161.72C37.4507 161.474 36.2342 159.766 35.8735 159.251C31.8564 153.517 29.9529 149.563 29.3096 144.346C28.2621 135.848 29.4895 130.5 32.027 127.533C32.6413 126.815 33.2789 126.306 33.9019 125.97C34.2334 125.792 34.4442 125.7 34.4956 125.689C35.5735 125.448 36.2365 124.392 35.9954 123.314C35.7543 122.236 34.6982 121.542 33.6202 121.783C33.2264 121.871 32.6655 122.078 31.9953 122.439C31.0669 122.939 30.1635 123.734 29.3079 124.658C23.0392 124.019 20.0922 123.577 17.9951 122.784C16.1482 122.086 15.9773 121.63 16.7137 120.347C25.511 115.923 43.9287 113.157 55.0885 113.156C63.8081 113.155 79.7952 116.873 90.4333 119.622C93.9977 120.542 94.7294 120.755 96.621 121.277C94.2649 123.034 89.4439 124.738 83.3087 125.247C83.0835 125.266 82.9434 125.443 82.7462 125.529C82.6074 125.348 82.5171 125.106 82.3711 124.935C81.4271 123.831 80.3863 122.999 79.3396 122.435C78.6693 122.074 78.1085 121.867 77.7145 121.779C76.6365 121.538 75.5805 122.233 75.3396 123.31C75.0987 124.388 75.7619 125.444 76.8399 125.685C76.8913 125.697 77.1021 125.788 77.4337 125.967C78.0567 126.302 78.6942 126.81 79.3088 127.529C81.8468 130.496 83.0751 135.844 82.029 144.341C81.3867 149.559 79.4839 153.513 75.4678 159.248C75.1071 159.763 73.8909 161.471 73.7179 161.717C73.0221 162.705 72.488 163.498 71.9994 164.248C69.5516 168.009 68.2658 171.094 68.0315 174.561C67.9625 175.581 68.0061 180.266 68.0951 187.78C68.1102 189.055 68.2793 200.673 68.2838 200.967C66.9421 201.725 66.0027 203.098 66.0028 204.749C66.0031 207.187 67.9709 209.155 70.4095 209.155C72.8481 209.154 74.8156 207.187 74.8154 204.748C74.8153 202.975 73.7598 201.482 72.2526 200.779C72.2461 200.277 72.1101 189.009 72.0952 187.748C72.0095 180.511 71.974 175.662 72.0316 174.811C72.2116 172.146 73.2659 169.644 75.3746 166.404C75.8321 165.701 76.3292 164.981 76.9994 164.029C77.1659 163.793 78.3803 162.056 78.7492 161.529C83.1079 155.305 85.2582 150.849 85.9979 144.841C86.8306 138.077 86.2654 132.917 84.7153 129.06C93.073 128.178 99.944 125.471 101.777 121.527C105.258 116.592 120.674 81.4184 100.46 69.1833C96.4145 66.7344 91.6503 64.7196 86.3971 63.1845L86.3922 6.93448L78.3609 6.93517L78.3606 3.46642L35.1413 3.47016ZM31.1419 10.9393L39.1107 10.9386L39.3309 27.9386C39.3406 28.6841 39.9605 29.2606 40.7061 29.2509C41.4516 29.2413 42.0593 28.6214 42.0497 27.8758L41.7983 10.9383L44.517 10.9381L44.7998 27.9381C44.8108 28.6836 45.3981 29.2615 46.1436 29.2505C46.8892 29.2394 47.4983 28.6209 47.4873 27.8753L47.2358 10.9379L49.9546 10.9376L50.2061 27.9376C50.2169 28.6831 50.8357 29.2608 51.5812 29.25C52.3267 29.2392 52.9044 28.6203 52.8936 27.8749L52.6421 10.9374L55.3609 10.9372L55.6124 27.9371C55.623 28.6827 56.242 29.2601 56.9875 29.2495C57.733 29.2389 58.3418 28.6199 58.3312 27.8744L58.0797 10.9369L60.8297 10.9367L61.05 27.9367C61.0546 28.3094 61.2147 28.6381 61.4563 28.8741C61.6979 29.1102 62.0211 29.2537 62.3938 29.2491C63.1394 29.2398 63.7468 28.6194 63.7375 27.8739L63.5173 10.9365L66.2986 10.9362L66.4875 27.905C66.4957 28.6505 67.1171 29.2568 67.8627 29.2486C68.6082 29.2404 69.1834 28.6503 69.1751 27.9047L68.9861 10.936L71.7674 10.9357L71.9564 27.9357C71.9605 28.3085 72.1132 28.6372 72.3627 28.8732C72.6122 29.1091 72.9587 29.2523 73.3315 29.2481C74.077 29.2398 74.6833 28.6498 74.6751 27.9042L74.4862 10.9355L82.3925 10.9348L82.3969 62.2473C78.1953 61.2363 73.8195 60.4151 69.2716 59.936L69.0841 59.936L69.0846 65.9672L62.3352 73.3116L62.211 82.5928L62.212 94.7803L56.5244 94.7808L50.3056 94.7814L50.2733 82.9376L50.1163 73.3126L43.1468 65.8132L43.1463 60.0945L31.1463 62.3455L31.1419 10.9393ZM46.0197 41.188L45.9904 64.3755L52.9599 71.8749L53.1492 91.9374L59.368 91.9368L59.5225 71.8743L66.2407 64.5612L66.2387 41.3425L46.0197 41.188ZM45.5578 121.282C45.0484 121.232 44.5158 121.369 44.0891 121.719C43.2356 122.421 43.1382 123.71 43.8394 124.563C43.8712 124.602 43.9181 124.67 44.0269 124.813C44.2163 125.062 44.4521 125.354 44.6832 125.688C45.3494 126.65 45.998 127.755 46.621 128.938C48.9603 133.379 50.0248 137.836 49.1222 141.875C48.4351 144.95 46.6061 147.711 43.4353 150.126C43.1568 150.338 42.1644 150.942 40.7792 151.751C40.6905 151.803 37.4839 153.662 37.4356 153.689C36.4728 154.23 36.1131 155.445 36.6545 156.408C37.1959 157.37 38.4106 157.699 39.3734 157.157C39.4251 157.128 42.7199 155.272 42.8108 155.22C44.3781 154.304 45.4057 153.669 45.8731 153.313C49.7829 150.336 52.1324 146.76 53.0285 142.75C54.1746 137.622 52.9238 132.266 50.1834 127.063C49.4811 125.729 48.7181 124.526 47.9643 123.438C47.5056 122.775 47.1244 122.271 46.9017 122C46.5511 121.574 46.0673 121.332 45.5578 121.282ZM65.7769 121.28C65.2675 121.33 64.7837 121.572 64.4331 121.999C64.2105 122.27 63.8293 122.774 63.3708 123.436C62.6172 124.525 61.8858 125.728 61.1835 127.062C58.444 132.265 57.163 137.621 58.3099 142.749C59.2067 146.759 61.5569 150.335 65.4671 153.311C65.9346 153.667 66.9935 154.302 68.5611 155.217C68.6519 155.27 71.9158 157.125 71.9675 157.154C72.9304 157.696 74.145 157.367 74.6862 156.404C75.2275 155.441 74.8676 154.227 73.9048 153.686C73.8565 153.658 70.6495 151.8 70.5608 151.748C69.1754 150.939 68.1829 150.336 67.9044 150.124C64.7332 147.71 62.9036 144.948 62.2161 141.874C61.3128 137.835 62.3766 133.378 64.715 128.936C65.3378 127.753 65.9862 126.649 66.6522 125.686C66.8833 125.352 67.1191 125.06 67.3084 124.811C67.4172 124.668 67.4953 124.6 67.5272 124.561C68.2282 123.708 68.0992 122.418 67.2457 121.717C66.8189 121.367 66.2862 121.23 65.7769 121.28ZM28.3735 160.064C27.8641 160.114 27.3492 160.357 26.9985 160.783C24.0604 164.358 22.5881 168.723 22.5621 174.253C22.5614 174.404 22.6311 200.839 22.627 200.877C21.1966 201.608 20.1896 203.036 20.1898 204.753C20.19 207.191 22.1578 209.159 24.5964 209.159C27.0351 209.158 29.0026 207.191 29.0024 204.752C29.0022 203.061 28.0235 201.65 26.627 200.908C26.6562 200.425 26.6538 197.055 26.6259 187.658C26.6229 186.662 26.5615 174.385 26.5622 174.252C26.584 169.618 27.7563 166.157 30.0925 163.314C30.7939 162.461 30.6644 161.203 29.811 160.502C29.3844 160.151 28.8829 160.015 28.3735 160.064ZM82.9679 160.06C82.4585 160.01 81.9571 160.147 81.5304 160.497C80.6772 161.199 80.5479 162.457 81.2494 163.31C83.5862 166.152 84.7591 169.613 84.7817 174.247C84.7823 174.378 84.7241 199.67 84.7527 200.841C83.3011 201.564 82.2529 203.015 82.253 204.747C82.2533 207.186 84.2524 209.153 86.691 209.153C89.1295 209.153 91.0971 207.185 91.0969 204.747C91.0967 203.049 90.1265 201.611 88.7215 200.872C88.7173 200.833 88.7318 194.753 88.7516 187.684C88.7544 186.688 88.7824 174.398 88.7817 174.247C88.7548 168.717 87.2817 164.353 84.343 160.778C83.9922 160.352 83.4774 160.109 82.9679 160.06Z" fill="url(#RadialGradient)" fill-rule="nonzero" filter="url(#Filter)" stroke="none" vectornator:shadowAngle="1.5708" vectornator:shadowColor="#050505" vectornator:shadowOffset="1" vectornator:shadowOpacity="1" vectornator:shadowRadius="2"/> -</g> -</svg> diff --git a/react-ui/index.html b/react-ui/index.html index 91d50a11c..3dc374a59 100755 --- a/react-ui/index.html +++ b/react-ui/index.html @@ -5,13 +5,14 @@ <link rel="icon" href="favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="theme-color" content="#000000" /> + <meta name="author" content="Matthias Feyll" /> <meta name="description" - content="Web site created using create-react-app" + content="goSDN web ui" /> <link rel="apple-touch-icon" href="logo.png" /> <link rel="manifest" href="manifest.json" /> - <title>goSDN</title> + <title>goSDN - ui</title> </head> <body> <noscript>You need to enable JavaScript to run this app.</noscript> diff --git a/react-ui/public/favicon.ico b/react-ui/public/favicon.ico old mode 100755 new mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..ae6dcf05241b89f446e88d15b81ffd69202fa83a GIT binary patch literal 31533 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 UF6((4fUd^&boFyt=akR{0H5d7UH||9 literal 3870 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 ZtMWJ#1p_C<F-T5Hu2|;y@Dg%;1puB)gNgtE diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index b017cf56f..0f0e8161e 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -1,4 +1,3 @@ -import logo from '@assets/logo.svg'; import { faCircleUser, faRightFromBracket } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useAppDispatch, useAppSelector } from '@hooks'; @@ -11,6 +10,7 @@ import { Dropdown } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Link, Outlet, useNavigate } from "react-router-dom"; import "./protected.layout.scss"; +import logo from '/public/logo.png'; export const ProtectedLayout = () => { diff --git a/react-ui/tsconfig.json b/react-ui/tsconfig.json index c679b7100..d40af31cc 100755 --- a/react-ui/tsconfig.json +++ b/react-ui/tsconfig.json @@ -22,7 +22,6 @@ "baseUrl": ".", "paths": { - "@assets/*": ["assets/*"], "@api/*": ["src/shared/api/*"], "@reducer/*": ["src/stores/reducer/*"], "@provider/*": ["src/shared/provider/*"], diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 83378d6ee..1304138c1 100755 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -58,7 +58,6 @@ export default defineConfig({ }, resolve: { alias: { - '@assets': '/assets', '@api': '/src/shared/api', '@reducer': '/src/stores/reducer', '@provider': '/src/shared/provider', -- GitLab From edc472e1f3156910f43fc89a7afc4e2714e73515 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@@stud.h-da.de> Date: Thu, 9 Jan 2025 19:07:17 +0100 Subject: [PATCH 56/78] (ui): minor css improvements --- react-ui/src/components/devices/view/device.scss | 1 + .../components/devices/view/device.view.table.tsx | 2 -- .../src/components/devices/view/device.view.tabs.tsx | 2 -- react-ui/src/components/devices/view/device.view.tsx | 12 ++++++------ react-ui/vite.config.mjs | 1 - 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/react-ui/src/components/devices/view/device.scss b/react-ui/src/components/devices/view/device.scss index 540cd4d01..866ce81eb 100755 --- a/react-ui/src/components/devices/view/device.scss +++ b/react-ui/src/components/devices/view/device.scss @@ -57,5 +57,6 @@ &.active { color: map-get($theme-colors, primary); font-weight: 500; + text-decoration: underline; } } diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index 56ad05f3f..8800010e2 100755 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -48,7 +48,6 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = <td data-copy-value={deviceId} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(cropedId, search) : DOMPurify.sanitize(cropedId) }}></td> </OverlayTrigger> <td data-copy-value={username} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) }}></td> - <td></td> </tr> ) }) @@ -61,7 +60,6 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = <th>{t('device.table.header.name')}</th> <th>{t('device.table.header.uuid')}</th> <th>{t('device.table.header.user')}</th> - <th>{t('device.table.header.last_updated')}</th> </tr> </thead> <tbody> diff --git a/react-ui/src/components/devices/view/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx index a2768a0ea..ef8ba120f 100755 --- a/react-ui/src/components/devices/view/device.view.tabs.tsx +++ b/react-ui/src/components/devices/view/device.view.tabs.tsx @@ -24,8 +24,6 @@ export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { <> {jsonYang && <JsonViewer json={jsonYang} /> - - //<ReactJson src={selectedDevice.json} name={false} collapsed={true} quotesOnKeys={false} /> } </> ); diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index a2c8458a7..518c12af4 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -15,19 +15,19 @@ const DeviceView = () => { <div className='m-4 pt-4'> <Container fluid> <Row> - <Col sm={5}> + <Col lg={5} sm={12}> <Container className='bg-white rounded c-box'> <Row> <Col sm={12} className='mt-4'><h3 className='text-black-50'>{t('device.title')}</h3></Col> </Row> <Row className='align-items-center'> - <Col sm={6}> + <Col xs={12} sm={6}> <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> </Form.Group> </Col> - <Col sm={{ span: 3, offset: 3 }} className='pt-2'> + <Col xs={12} sm={6} className='pt-2'> <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> </Col> </Row> @@ -39,10 +39,10 @@ const DeviceView = () => { </Row> </Container> </Col> - <Col sm={7}> + <Col xs={12} lg={7} className='mt-5 mt-lg-0'> <Container className='bg-white rounded c-box'> <Row> - <Col sm={12} className='mt-4'> + <Col xs={12} className='mt-4'> <Nav className='justify-content-around'> <NavLink className={handleActiveTabLink(DeviceViewTabValues.METADATA) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.METADATA)}>{t('device.tabs.metadata.title')}</NavLink> <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> @@ -51,7 +51,7 @@ const DeviceView = () => { </Row> <Row className='align-items-start'> - <Col sm={12} className='pt-2'> + <Col xs={12}> {DeviceViewTabs(activeTab)} </Col> </Row> diff --git a/react-ui/vite.config.mjs b/react-ui/vite.config.mjs index 1304138c1..33fd69cc7 100755 --- a/react-ui/vite.config.mjs +++ b/react-ui/vite.config.mjs @@ -1,7 +1,6 @@ import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; - export default defineConfig({ plugins: [react()], build: { -- GitLab From 5946b4cdf8b00ee2bbf010f6aeba8911aecb3182 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 9 Jan 2025 19:10:49 +0100 Subject: [PATCH 57/78] (ui): fix import path --- react-ui/src/components/login/view/login.view.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/react-ui/src/components/login/view/login.view.tsx b/react-ui/src/components/login/view/login.view.tsx index 38afc83a1..62c84eeb8 100755 --- a/react-ui/src/components/login/view/login.view.tsx +++ b/react-ui/src/components/login/view/login.view.tsx @@ -1,10 +1,10 @@ -import logo from '@assets/logo.svg' import { BasicProp } from '@shared/types/interfaces.type' import React, { useRef } from 'react' import { Alert, Button, Col, Container, Form, Image, Row, Spinner } from 'react-bootstrap' import { useTranslation } from 'react-i18next' import useLoginViewModel from '../viewmodel/login.viewmodel' import './login.scss' +import logo from '/public/logo.svg' const LoginView: React.FC<BasicProp> = () => { const { t } = useTranslation('common') -- GitLab From 9d4d0d2df0f3d6198e8836ec8ba4614f27964fe9 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Fri, 10 Jan 2025 01:42:44 +0100 Subject: [PATCH 58/78] (ui): remove sidebar --- .../components/devices/view/device.view.tsx | 4 +- react-ui/src/routes.tsx | 25 ++-- .../protected.layout/protected.layout.scss | 49 ++++++-- .../protected.layout/protected.layout.tsx | 20 +-- react-ui/src/shared/style/box.scss | 28 +++-- react-ui/src/shared/style/colors.scss | 18 +-- react-ui/src/shared/style/utils.scss | 4 - .../src/shared/utils/loading-fallback.tsx | 117 ++++++++++++++++++ 8 files changed, 207 insertions(+), 58 deletions(-) create mode 100644 react-ui/src/shared/utils/loading-fallback.tsx diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 518c12af4..4ef007327 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -16,7 +16,7 @@ const DeviceView = () => { <Container fluid> <Row> <Col lg={5} sm={12}> - <Container className='bg-white rounded c-box'> + <Container className='bg-white c-box'> <Row> <Col sm={12} className='mt-4'><h3 className='text-black-50'>{t('device.title')}</h3></Col> </Row> @@ -40,7 +40,7 @@ const DeviceView = () => { </Container> </Col> <Col xs={12} lg={7} className='mt-5 mt-lg-0'> - <Container className='bg-white rounded c-box'> + <Container className='bg-white c-box'> <Row> <Col xs={12} className='mt-4'> <Nav className='justify-content-around'> diff --git a/react-ui/src/routes.tsx b/react-ui/src/routes.tsx index 532d03fbf..a476feaae 100755 --- a/react-ui/src/routes.tsx +++ b/react-ui/src/routes.tsx @@ -1,5 +1,6 @@ import { BasicLayout } from "@layout/basic.layout"; import { ProtectedLayout } from "@layout/protected.layout/protected.layout"; +import DelayedRender, { SplashScreen } from "@utils/loading-fallback"; import { lazy, Suspense } from 'react'; import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom"; @@ -10,17 +11,16 @@ export const LOGIN_URL = '/login'; const DeviceView = lazy(() => import('./components/devices/view/device.view')); const LoginLayout = lazy(() => import('./components/login/layouts/login.layout')); -// Loading fallback component -const LoadingFallback = () => <div>Loading...</div>; - export const router = createBrowserRouter( createRoutesFromElements( <Route element={<BasicLayout />}> <Route path={LOGIN_URL} element={ - <Suspense fallback={<LoadingFallback />}> - <LoginLayout /> + <Suspense fallback={null}> + <DelayedRender> + <LoginLayout /> + </DelayedRender> </Suspense> } /> @@ -28,9 +28,16 @@ export const router = createBrowserRouter( <Route path={DEVICE_URL} element={ - <Suspense fallback={<LoadingFallback />}> - <DeviceView /> - </Suspense> + <DelayedRender + loading={{ + minimumLoadingTime: 1000, + component: SplashScreen + }} + > + <Suspense fallback={null}> + <DeviceView /> + </Suspense> + </DelayedRender> } /> <Route @@ -38,6 +45,6 @@ export const router = createBrowserRouter( element={<Navigate to={DEVICE_URL} replace={true} />} /> </Route> - </Route> + </Route > ) ); \ No newline at end of file diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss index 07b38d5a7..713e63481 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss @@ -1,7 +1,5 @@ @import "/src/shared/style/colors.scss"; -$sidebar-width: 4.5em; - .head-links { text-decoration: none; color: map-get($theme-colors, dark); @@ -19,11 +17,46 @@ $sidebar-width: 4.5em; } } -.sidebar { - width: $sidebar-width; - height: 100vh; -} +// Add these styles to your protected.layout.scss +nav { + border-radius: 0 0 $border-radius $border-radius; + box-shadow: + 0px 4px 8px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 35%), + 0px 2px 4px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 20%); + + .head-links { + text-decoration: none; + color: map-get($theme-colors, "dark"); + padding: 8px 16px; + margin: 0 4px; + border-radius: 12px; + transition: all 0.2s ease; -.main-content { - margin-left: $sidebar-width; + &:hover { + background-color: map-get($theme-colors, "bg-primary"); + } + + &.active { + color: map-get($theme-colors, "primary"); + background-color: map-get($theme-colors, "primary::hover"); + } + } + + .dropdown-menu { + border-radius: $border-radius; + box-shadow: + 0px 4px 8px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 35%), + 0px 2px 4px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 20%); + border: none; + padding: 8px; + + .dropdown-item { + border-radius: 8px; + padding: 8px 16px; + + &:hover { + background-color: map-get($theme-colors, "bg-primary"); + } + } + } } diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 0f0e8161e..b1d70b823 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -69,14 +69,6 @@ export const ProtectedLayout = () => { } ); - const VerticalSidebar = () => { - return ( - <div className="d-flex fixed-top flex-column flex-shrink-0 bg-white sidebar justify-content-end border-end border-dark py-3 z-2"> - <FontAwesomeIcon className="clickable icon" icon={faRightFromBracket} onClick={logout} size="2x" /> - </div> - ) - } - const HorizontalNavbar = () => { return ( <nav className="bg-white border-bottom border-dark py-2 d-flex align-items-center z-3 position-relative"> @@ -87,15 +79,18 @@ export const ProtectedLayout = () => { <Dropdown className="ms-auto px-3"> <Dropdown.Toggle as={UserIconToggle}> - <FontAwesomeIcon icon={faCircleUser} className="icon clickable" /> + <FontAwesomeIcon icon={faCircleUser} className="clickable" size="2x" /> </Dropdown.Toggle> <Dropdown.Menu as={UserIconMenu}> <Dropdown.Item eventKey="1">{user?.name}</Dropdown.Item> <hr /> - <Dropdown.Item eventKey="1"> + <Dropdown.Item eventKey="2"> <Link className="text-decoration-none text-reset" to="/">{t('protected.link.settings')}</Link> </Dropdown.Item> + <Dropdown.Item eventKey="3" onClick={logout}> + <Link className="text-decoration-none text-reset" to="/"><FontAwesomeIcon className="clickable" icon={faRightFromBracket} />{t('protected.link.settings')}</Link> + </Dropdown.Item> </Dropdown.Menu> </Dropdown> </nav> @@ -106,10 +101,7 @@ export const ProtectedLayout = () => { <div> <MenuProvider> {HorizontalNavbar()} - {VerticalSidebar()} - <div className='main-content'> - <Outlet /> - </div> + <Outlet /> </MenuProvider> </div> ) diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss index bd75fb00a..934861a2b 100755 --- a/react-ui/src/shared/style/box.scss +++ b/react-ui/src/shared/style/box.scss @@ -1,26 +1,30 @@ -@import './colors.scss'; +@import "./colors.scss"; $box-padding: 10px; $border-radius: 20px; - +$border-width: 2px; .c-box { padding: $box-padding; background-color: white; - box-shadow: 0px 4px 4px rgba(0,0,0, .35); + position: relative; border-radius: $border-radius; + + background: + linear-gradient(white, white) padding-box, + linear-gradient( + 180deg, + rgba(map-get($theme-colors, "primary"), 0.3) 0%, + rgba(map-get($theme-colors, "primary"), 0.1) 100% + ) + border-box; + border: $border-width solid transparent; + + box-shadow: 0px 1px 2px rgba(map-get($theme-colors, "dark"), 0.12); } .abstract-box { padding: 16px $box-padding; - font-size: .90em; + font-size: 0.9em; border-radius: calc($border-radius / 2); } - - -// @each $color, $value in $theme-colors { -// .#{$color}-box { -// @extend .abstract-box; -// background-color: $value !important; -// } -// } diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss index 749af9e8e..d91ffb44e 100755 --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -1,11 +1,11 @@ $theme-colors: ( - 'primary': #b350e0, - 'primary::hover': #ddaff3af, - 'bg-primary': #E1E1E1, - 'danger': #ffdcdc, - 'warning': #dbd116, - 'dark': #595959, - 'black': #000000, + "primary": #b350e0, + "primary::hover": #ddaff3af, + "bg-primary": #ededed, + "danger": #ffdcdc, + "warning": #dbd116, + "dark": #595959, + "black": #000000 ); - -@import '/node_modules/bootstrap/scss/bootstrap'; + +@import "/node_modules/bootstrap/scss/bootstrap"; diff --git a/react-ui/src/shared/style/utils.scss b/react-ui/src/shared/style/utils.scss index d8be654f7..d6f34d301 100755 --- a/react-ui/src/shared/style/utils.scss +++ b/react-ui/src/shared/style/utils.scss @@ -7,7 +7,3 @@ cursor: pointer; } } - -.icon { - font-size: 1.75em; -} diff --git a/react-ui/src/shared/utils/loading-fallback.tsx b/react-ui/src/shared/utils/loading-fallback.tsx new file mode 100644 index 000000000..d1c6daa4a --- /dev/null +++ b/react-ui/src/shared/utils/loading-fallback.tsx @@ -0,0 +1,117 @@ +import React, { useEffect, useState } from 'react'; +import { Col, Container, Row } from 'react-bootstrap'; +import logo from '/public/logo.png'; + +interface DelayedRenderProps { + children: React.ReactNode; + loading?: { + minimumLoadingTime: number; + component: () => JSX.Element + } +} + +export const SplashScreen = () => { + const [dots, setDots] = useState(''); + + useEffect(() => { + const dotsInterval = setInterval(() => { + setDots(prev => prev.length >= 3 ? '' : prev + '.'); + }, 500); + + return () => clearInterval(dotsInterval); + }, []); + + return ( + <div className="splash-screen-overlay"> + <Container fluid className="h-100 d-flex align-items-center justify-content-center bg-bg-primary"> + <Row> + <Col className="text-center"> + <div className="loading-bounce mb-4"> + <img + src={logo} + alt="Logo" + className="img-fluid" + style={{ width: '120px', height: '120px', objectFit: 'contain' }} + /> + </div> + <div className="loading-text"> + <span className="h4 text-secondary">Loading</span> + <span className="h4 text-secondary dots-width">{dots}</span> + </div> + </Col> + </Row> + </Container> + + <style> + {` + .splash-screen-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #f8f9fa; + z-index: 0; + display: flex; + align-items: center; + justify-content: center; + } + + .loading-bounce { + animation: bounce 1s infinite; + } + + @keyframes bounce { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-20px); + } + } + + .loading-text { + display: flex; + justify-content: center; + align-items: center; + } + + .dots-width { + min-width: 24px; + text-align: left; + margin-left: 2px; + } + `} + </style> + </div> + ); +}; + +export const DelayedRender: React.FC<DelayedRenderProps> = ({ + children, + loading +}) => { + const [shouldRender, setShouldRender] = useState(false); + + useEffect(() => { + if (!loading) { + setShouldRender(true); + return; + } + + const timer = setTimeout(() => { + setShouldRender(true); + }, loading.minimumLoadingTime); + + return () => clearTimeout(timer); + }, [loading]); + + if (!shouldRender && loading) { + const LoadingComponent = loading.component; + return <LoadingComponent />; + } + + return <>{children}</>; +}; + +export default DelayedRender; \ No newline at end of file -- GitLab From b7158c54739d3f28d5a07728f012e25a8a8bf650 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Fri, 10 Jan 2025 10:38:32 +0100 Subject: [PATCH 59/78] (ui): refactor navbar styles --- .../login/viewmodel/login.viewmodel.ts | 6 +-- .../protected.layout/protected.layout.scss | 15 +++--- .../protected.layout/protected.layout.tsx | 50 +++++++++++-------- react-ui/src/shared/style/box.scss | 4 +- react-ui/src/shared/style/colors.scss | 2 + 5 files changed, 42 insertions(+), 35 deletions(-) diff --git a/react-ui/src/components/login/viewmodel/login.viewmodel.ts b/react-ui/src/components/login/viewmodel/login.viewmodel.ts index 60c39b55a..fabb0a861 100755 --- a/react-ui/src/components/login/viewmodel/login.viewmodel.ts +++ b/react-ui/src/components/login/viewmodel/login.viewmodel.ts @@ -7,9 +7,9 @@ export interface PageLoginState { } export default function useLoginViewModel() { - const {login, loginProperties} = useAuth(); - const {isLoading: loginLoading, error: loginError, reset: resetLogin} = loginProperties!; - + const { login, loginProperties } = useAuth(); + const { isLoading: loginLoading, error: loginError, reset: resetLogin } = loginProperties; + const [localFormState, updateLocalFormState] = useState({ submitted: false, valid: false, diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss index 713e63481..52429031b 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss @@ -8,7 +8,6 @@ &:hover { color: map-get($theme-colors, primary); - font-weight: 600; } &.active { @@ -17,12 +16,14 @@ } } +#navbar { + padding: 1em !important; +} + // Add these styles to your protected.layout.scss nav { - border-radius: 0 0 $border-radius $border-radius; - box-shadow: - 0px 4px 8px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 35%), - 0px 2px 4px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 20%); + border-radius: $border-radius $border-radius; + padding: 0 !important; .head-links { text-decoration: none; @@ -44,9 +45,7 @@ nav { .dropdown-menu { border-radius: $border-radius; - box-shadow: - 0px 4px 8px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 35%), - 0px 2px 4px mix(map-get($theme-colors, "primary"), map-get($theme-colors, "dark"), 20%); + box-shadow: $box-shadow; border: none; padding: 8px; diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index b1d70b823..5dc565455 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -6,7 +6,7 @@ import { MenuProvider } from '@provider/menu/menu.provider'; import { DEVICE_URL, LOGIN_URL } from '@routes'; import { fetchPnds, fetchUser } from '@shared/routine/user.routine'; import React, { useEffect } from "react"; -import { Dropdown } from "react-bootstrap"; +import { Col, Container, Dropdown, Row } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Link, Outlet, useNavigate } from "react-router-dom"; import "./protected.layout.scss"; @@ -71,29 +71,35 @@ export const ProtectedLayout = () => { const HorizontalNavbar = () => { return ( - <nav className="bg-white border-bottom border-dark py-2 d-flex align-items-center z-3 position-relative"> - <Link to="/"><img src={logo} className="mx-4 me-5" width={25} alt="logo" /></Link> - <Link className={"head-links" + handleActiveLink(DEVICE_URL)} to="/">{t('protected.link.device_list')}</Link> - <Link className={"head-links" + handleActiveLink('/map')} to="/">{t('protected.link.map')}</Link> - <Link className={"head-links" + handleActiveLink('/configuration_management')} to="/">{t('protected.link.configuration_mgmt')}</Link> + <Container fluid> + <Row> + <Col> + <nav id="navbar" className="bg-white mx-4 mt-4 d-flex align-items-center c-box"> + <Link to="/"><img src={logo} className="mx-4" width={45} alt="logo" /></Link> + <Link className={"head-links" + handleActiveLink(DEVICE_URL)} to="/">{t('protected.link.device_list')}</Link> + <Link className={"head-links" + handleActiveLink('/map')} to="/">{t('protected.link.map')}</Link> + <Link className={"head-links" + handleActiveLink('/configuration_management')} to="/">{t('protected.link.configuration_mgmt')}</Link> - <Dropdown className="ms-auto px-3"> - <Dropdown.Toggle as={UserIconToggle}> - <FontAwesomeIcon icon={faCircleUser} className="clickable" size="2x" /> - </Dropdown.Toggle> + <Dropdown className="ms-auto px-3"> + <Dropdown.Toggle as={UserIconToggle}> + <FontAwesomeIcon icon={faCircleUser} className="clickable" size="2x" /> + </Dropdown.Toggle> - <Dropdown.Menu as={UserIconMenu}> - <Dropdown.Item eventKey="1">{user?.name}</Dropdown.Item> - <hr /> - <Dropdown.Item eventKey="2"> - <Link className="text-decoration-none text-reset" to="/">{t('protected.link.settings')}</Link> - </Dropdown.Item> - <Dropdown.Item eventKey="3" onClick={logout}> - <Link className="text-decoration-none text-reset" to="/"><FontAwesomeIcon className="clickable" icon={faRightFromBracket} />{t('protected.link.settings')}</Link> - </Dropdown.Item> - </Dropdown.Menu> - </Dropdown> - </nav> + <Dropdown.Menu as={UserIconMenu}> + <Dropdown.Item eventKey="1">{user?.name}</Dropdown.Item> + <hr /> + <Dropdown.Item eventKey="2"> + <Link className="text-decoration-none text-reset" to="/">{t('protected.link.settings')}</Link> + </Dropdown.Item> + <Dropdown.Item eventKey="3" onClick={logout}> + <Link className="text-decoration-none text-reset" to="/"><FontAwesomeIcon className="clickable" icon={faRightFromBracket} /><span className="ms-1">{t('global.menu_item.logout')}</span></Link> + </Dropdown.Item> + </Dropdown.Menu> + </Dropdown> + </nav> + </Col> + </Row> + </Container> ) } diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss index 934861a2b..418fe4af0 100755 --- a/react-ui/src/shared/style/box.scss +++ b/react-ui/src/shared/style/box.scss @@ -20,11 +20,11 @@ $border-width: 2px; border-box; border: $border-width solid transparent; - box-shadow: 0px 1px 2px rgba(map-get($theme-colors, "dark"), 0.12); + box-shadow: $box-shadow; } .abstract-box { - padding: 16px $box-padding; + padding: $box-padding; font-size: 0.9em; border-radius: calc($border-radius / 2); } diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss index d91ffb44e..29c971f86 100755 --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -8,4 +8,6 @@ $theme-colors: ( "black": #000000 ); +$box-shadow: 0px 4px 8px rgba(map-get($theme-colors, "primary"), 0.2); + @import "/node_modules/bootstrap/scss/bootstrap"; -- GitLab From bc6b88dddb5b305140a2006ae60d33d584474900 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Fri, 10 Jan 2025 19:45:07 +0100 Subject: [PATCH 60/78] (ui): implement movable box containers --- react-ui/package.json | 2 + .../src/components/devices/view/device.scss | 5 -- .../devices/view/device.view.table.tsx | 1 + .../components/devices/view/device.view.tsx | 50 ++++++++---- react-ui/src/index.scss | 2 +- .../layouts/grid.layout/grid.layout.scss | 81 +++++++++++++++++++ .../layouts/grid.layout/grid.layout.tsx | 61 ++++++++++++++ .../protected.layout/protected.layout.tsx | 10 +-- react-ui/src/shared/style/box.scss | 35 +++++++- react-ui/yarn.lock | 54 ++++++++++++- 10 files changed, 268 insertions(+), 33 deletions(-) create mode 100644 react-ui/src/shared/layouts/grid.layout/grid.layout.scss create mode 100644 react-ui/src/shared/layouts/grid.layout/grid.layout.tsx diff --git a/react-ui/package.json b/react-ui/package.json index 30db7c97c..1f742d78d 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -14,6 +14,7 @@ "@fortawesome/react-fontawesome": "^0.2.2", "@fullhuman/postcss-purgecss": "^7.0.2", "@reduxjs/toolkit": "^2.2.4", + "@types/react-grid-layout": "^1.3.5", "@vitejs/plugin-react": "^4.2.1", "bootstrap": "^5.3.3", "crypto-js": "^4.2.0", @@ -24,6 +25,7 @@ "react-bootstrap": "^2.10.2", "react-dom": "^18.3.1", "react-error-boundary": "^4.1.2", + "react-grid-layout": "^1.5.0", "react-i18next": "^15.0.0", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", diff --git a/react-ui/src/components/devices/view/device.scss b/react-ui/src/components/devices/view/device.scss index 866ce81eb..8d4099fc8 100755 --- a/react-ui/src/components/devices/view/device.scss +++ b/react-ui/src/components/devices/view/device.scss @@ -24,11 +24,6 @@ } } -.c-box { - padding: 2em !important; - padding-top: 1em !important; -} - .border-right { $border-padding: 2em; diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index 8800010e2..1f7221ead 100755 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -49,6 +49,7 @@ export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) = </OverlayTrigger> <td data-copy-value={username} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) }}></td> </tr> + ) }) }, [devices, searchRef, pnds, selectedDevice, trClickHandler]); diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 4ef007327..f705aa4eb 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,3 +1,6 @@ +import { faGripVertical } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { GridLayout } from '@layout/grid.layout/grid.layout'; import { useRef } from 'react'; import { Button, Col, Container, Form, Nav, NavLink, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; @@ -13,12 +16,15 @@ const DeviceView = () => { return ( <div className='m-4 pt-4'> - <Container fluid> - <Row> - <Col lg={5} sm={12}> - <Container className='bg-white c-box'> + <GridLayout> + <> + <div key="device-list"> + <Container className='c-box hoverable h-100'> + <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row> - <Col sm={12} className='mt-4'><h3 className='text-black-50'>{t('device.title')}</h3></Col> + <Col sm={12} className='mt-4'> + <h3 className='text-black-50'>{t('device.title')}</h3> + </Col> </Row> <Row className='align-items-center'> @@ -38,14 +44,26 @@ const DeviceView = () => { </Col> </Row> </Container> - </Col> - <Col xs={12} lg={7} className='mt-5 mt-lg-0'> - <Container className='bg-white c-box'> + </div> + + <div key="device-details"> + <Container className='c-box hoverable h-100'> + <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row> <Col xs={12} className='mt-4'> <Nav className='justify-content-around'> - <NavLink className={handleActiveTabLink(DeviceViewTabValues.METADATA) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.METADATA)}>{t('device.tabs.metadata.title')}</NavLink> - <NavLink className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)}>{t('device.tabs.yang_model.title')}</NavLink> + <NavLink + className={handleActiveTabLink(DeviceViewTabValues.METADATA) + " tab-links"} + onClick={() => setActiveTab(DeviceViewTabValues.METADATA)} + > + {t('device.tabs.metadata.title')} + </NavLink> + <NavLink + className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} + onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)} + > + {t('device.tabs.yang_model.title')} + </NavLink> </Nav> </Col> </Row> @@ -56,11 +74,11 @@ const DeviceView = () => { </Col> </Row> </Container> - </Col> - </Row> - </Container> + </div> + </> + </GridLayout> </div> - ) -} + ); +}; -export default DeviceView +export default DeviceView; \ No newline at end of file diff --git a/react-ui/src/index.scss b/react-ui/src/index.scss index 8dd280e64..5c9f184b7 100755 --- a/react-ui/src/index.scss +++ b/react-ui/src/index.scss @@ -1,4 +1,4 @@ -@import './shared/style/index.scss'; +@import "./shared/style/index.scss"; body { margin: 0; diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.scss b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss new file mode 100644 index 000000000..c90375d37 --- /dev/null +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss @@ -0,0 +1,81 @@ +@import "/src/shared/style/colors.scss"; + +.drag-handle { + position: absolute; + top: 0; + right: 0; + padding: 10px; + cursor: grab; + color: map-get($theme-colors, "dark"); + background-color: lighten(map-get($theme-colors, primary), 38%); + border-radius: 0 0.25rem 0 0.25rem; + border-left: 1px solid lighten(map-get($theme-colors, dark), 35%); + border-bottom: 1px solid lighten(map-get($theme-colors, dark), 35%); + z-index: 10; + + &:hover { + color: map-get($theme-colors, primary); + background-color: lighten(map-get($theme-colors, primary), 35%); + } + + &:active { + cursor: grabbing; + } +} + +.react-grid-item { + min-height: 600px !important; + + &.react-draggable-dragging { + z-index: 100; + + .drag-handle { + cursor: grabbing; + } + } +} + +.react-grid-layout { + width: 100% !important; +} + +.react-grid-item.react-grid-placeholder { + background: lighten(map-get($theme-colors, primary), 30%) !important; + opacity: 0.2; + transition-duration: 100ms; + z-index: 2; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +.react-grid-item { + /* Hide resize handle by default */ + .react-resizable-handle-se { + opacity: 0; + transition: opacity 0.2s ease-in-out; + } + + /* Show resize handle on container hover */ + &:hover .react-resizable-handle-se { + opacity: 1; + } +} + +/* Style the resize handle */ +.react-resizable-handle-se { + position: absolute; + right: 0; + bottom: 0; + width: 20px; + height: 20px; + background-image: url("data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2IDYiPjxwYXRoIGQ9Ik02IDZIMHYtNmg2djZ6TTUgMUgxdjRoNFYxeiIgZmlsbD0iIzk5OTk5OSIvPjwvc3ZnPg=="); + background-position: bottom right; + background-repeat: no-repeat; + background-size: 10px 10px; + cursor: se-resize; + z-index: 10; +} diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx new file mode 100644 index 000000000..c184e655b --- /dev/null +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx @@ -0,0 +1,61 @@ +import React, { ReactElement, useEffect, useState } from 'react'; +import { Responsive, WidthProvider } from 'react-grid-layout'; +import 'react-grid-layout/css/styles.css'; +import 'react-resizable/css/styles.css'; +import './grid.layout.scss'; + +const ResponsiveGridLayout = WidthProvider(Responsive); + +interface GridLayoutProps { + children: ReactElement; +} + +export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { + const rowHeight = 50; + const [mounted, setMounted] = useState(false); + const layouts = { + lg: [ + { i: 'device-list', x: 0, y: 0, w: 1, h: 1, minW: 1, minH: 1 }, + { i: 'device-details', x: 2, y: 0, w: 2, h: 1, minW: 2, minH: 1 } + ] + }; + + useEffect(() => { + setMounted(true); + // Force layout recalculation after mount + window.dispatchEvent(new Event('resize')); + }, []); + + const gridItems = React.Children.map(children.props.children, (child, index) => { + if (!React.isValidElement(child)) return null; + + return React.cloneElement(child, { + key: index === 0 ? 'device-list' : 'device-details', + 'data-grid': layouts.lg[index] + }); + }); + + return ( + <div style={{ display: mounted ? 'block' : 'none' }}> + <ResponsiveGridLayout + className="layout" + layouts={layouts} + breakpoints={{ lg: 996, sm: 480 }} + cols={{ lg: 4, sm: 3 }} + rowHeight={rowHeight} + margin={[20, 20]} + draggableHandle=".drag-handle" + isDraggable={true} + isResizable={true} + preventCollision={true} + compactType={null} + useCSSTransforms={mounted} + resizeHandles={['se']} // Only show resize handle in bottom right corner + > + {gridItems} + </ResponsiveGridLayout> + </div> + ); +}; + +export default GridLayout; \ No newline at end of file diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index 5dc565455..dbcb49192 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -104,11 +104,9 @@ export const ProtectedLayout = () => { } return ( - <div> - <MenuProvider> - {HorizontalNavbar()} - <Outlet /> - </MenuProvider> - </div> + <MenuProvider> + {HorizontalNavbar()} + <Outlet /> + </MenuProvider> ) }; \ No newline at end of file diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss index 418fe4af0..53158f515 100755 --- a/react-ui/src/shared/style/box.scss +++ b/react-ui/src/shared/style/box.scss @@ -1,26 +1,55 @@ @import "./colors.scss"; $box-padding: 10px; -$border-radius: 20px; +$border-radius: 0.25em; $border-width: 2px; +$transition-duration: 0.3s; .c-box { padding: $box-padding; background-color: white; position: relative; border-radius: $border-radius; + transition: box-shadow $transition-duration ease-in-out; background: linear-gradient(white, white) padding-box, linear-gradient( 180deg, - rgba(map-get($theme-colors, "primary"), 0.3) 0%, + rgba(map-get($theme-colors, "primary"), 0.4) 0%, + rgba(map-get($theme-colors, "primary"), 0.2) 40%, rgba(map-get($theme-colors, "primary"), 0.1) 100% ) border-box; border: $border-width solid transparent; - box-shadow: $box-shadow; + + &::before { + content: ""; + position: absolute; + top: -$border-width; + left: -$border-width; + right: -$border-width; + bottom: -$border-width; + background: linear-gradient( + 180deg, + rgba(map-get($theme-colors, "primary"), 0.4) 0%, + rgba(map-get($theme-colors, "primary"), 0.2) 60%, + rgba(map-get($theme-colors, "primary"), 0.1) 100% + ); + border-radius: inherit; + z-index: -1; + opacity: 0; + transition: opacity $transition-duration ease-in-out; + } + + &:hover { + box-shadow: 0 0.5rem 1rem rgba(map-get($theme-colors, "primary"), 0.2); + + &::before { + opacity: 1; + } + } } .abstract-box { diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index ec57231a8..db8fb7d3c 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -2593,6 +2593,13 @@ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.3.tgz#3654138d0da1b0c7916f6ed0dc1cc2b576d47650" integrity sha512-uTYkxTLkYp41nq/ULXyXMtkNT1vu5fXJoqad6uTNCOGat5t9cLgF4vMNLBXsTOXpdOI44XzKPY1M5RRm0bQHuw== +"@types/react-grid-layout@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/react-grid-layout/-/react-grid-layout-1.3.5.tgz#f4b52bf27775290ee0523214be0987be14e66823" + integrity sha512-WH/po1gcEcoR6y857yAnPGug+ZhkF4PaTUxgAbwfeSH/QOgVSakKHBXoPGad/sEznmkiaK3pqHk+etdWisoeBQ== + dependencies: + "@types/react" "*" + "@types/react-transition-group@^4.4.6": version "4.4.11" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5" @@ -3843,7 +3850,12 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clsx@^2.1.0: +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.0.0, clsx@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== @@ -5351,6 +5363,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-equals@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-4.0.3.tgz#72884cc805ec3c6679b99875f6b7654f39f0e8c7" + integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg== + fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -8680,7 +8697,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.6.2, prop-types@^15.8.1: +prop-types@15.x, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -8838,6 +8855,14 @@ react-dom@^18.3.1: loose-envify "^1.1.0" scheduler "^0.23.2" +react-draggable@^4.0.3, react-draggable@^4.4.5: + version "4.4.6" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e" + integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + react-error-boundary@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.1.2.tgz#bc750ad962edb8b135d6ae922c046051eb58f289" @@ -8850,6 +8875,18 @@ react-error-overlay@^6.0.11: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== +react-grid-layout@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-1.5.0.tgz#b6cc9412b58cf8226aebc0df7673d6fa782bdee2" + integrity sha512-WBKX7w/LsTfI99WskSu6nX2nbJAUD7GD6nIXcwYLyPpnslojtmql2oD3I2g5C3AK8hrxIarYT8awhuDIp7iQ5w== + dependencies: + clsx "^2.0.0" + fast-equals "^4.0.3" + prop-types "^15.8.1" + react-draggable "^4.4.5" + react-resizable "^3.0.5" + resize-observer-polyfill "^1.5.1" + react-i18next@^15.0.0: version "15.1.4" resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.1.4.tgz#65c03c31a5e42202000652e163f22f23a9306a60" @@ -8896,6 +8933,14 @@ react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== +react-resizable@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-3.0.5.tgz#362721f2efbd094976f1780ae13f1ad7739786c1" + integrity sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w== + dependencies: + prop-types "15.x" + react-draggable "^4.0.3" + react-router-dom@^6.23.1: version "6.28.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.28.0.tgz#f73ebb3490e59ac9f299377062ad1d10a9f579e6" @@ -9189,6 +9234,11 @@ reselect@^5.1.0: resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" -- GitLab From b46663aaa04058952c1e358ca3aea30fd2559d9d Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 16 Jan 2025 01:00:04 +0100 Subject: [PATCH 61/78] (ui): implement UpdateIndicator --- .../devices/reducer/device.reducer.ts | 15 ++++++ .../devices/routines/device.routine.ts | 12 ++++- .../components/devices/view/device.view.tsx | 14 +++-- .../devices/view_model/device.viewmodel.ts | 2 +- .../src/i18n/locales/en/translations.json | 3 ++ .../update-indicator.layout.tsx | 52 +++++++++++++++++++ .../update-indicator.viewmodel.tsx | 39 ++++++++++++++ .../src/shared/reducer/routine.reducer.ts | 10 +++- react-ui/src/shared/style/colors.scss | 2 +- react-ui/src/shared/types/thunk.type.ts | 3 +- 10 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.layout.tsx create mode 100644 react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.viewmodel.tsx diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index cea12fbc9..f211fe024 100755 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -5,6 +5,8 @@ import { } from '@api/api' import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs' import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import { refreshUpdateTimer } from '@shared/reducer/routine.reducer' +import { Category, CategoryType } from '@shared/types/category.type' import { REHYDRATE } from 'redux-persist' import { RootState } from 'src/stores' import '../routines/index' @@ -129,6 +131,19 @@ startListening({ }, }) +startListening({ + predicate: (action) => setSelectedMne.match(action), + effect: async (action, listenerApi) => { + listenerApi.dispatch(refreshUpdateTimer(Category.TAB as CategoryType)) + }, +}) + +startListening({ + predicate: (action) => setDevices.match(action), + effect: async (action, listenerApi) => { + listenerApi.dispatch(refreshUpdateTimer(Category.DEVICE as CategoryType)) + }, +}) /** * On startup reset the selected device diff --git a/react-ui/src/components/devices/routines/device.routine.ts b/react-ui/src/components/devices/routines/device.routine.ts index ef92b1c8e..058f65f9f 100755 --- a/react-ui/src/components/devices/routines/device.routine.ts +++ b/react-ui/src/components/devices/routines/device.routine.ts @@ -1,21 +1,29 @@ import { NetworkElementServiceGetAllFlattenedApiArg, api } from '@api/api' import { setDevices } from '@component/devices/reducer/device.reducer' import { createAsyncThunk } from '@reduxjs/toolkit' +import { addRoutine } from '@shared/reducer/routine.reducer' import { setUser } from '@shared/reducer/user.reducer' +import { Category, CategoryType } from '@shared/types/category.type' import { RootState } from 'src/stores' import { startListening } from '../../../stores/middleware/listener.middleware' export const FETCH_DEVICE_ACTION = 'subscription/device/fetchDevices' // continously fetch devices -const FETCH_DEVICES_INTERVAL = 15000 // in ms startListening({ actionCreator: setUser, effect: async (_, listenerApi) => { - listenerApi.dispatch(fetchDevicesThunk()) + listenerApi.dispatch( + addRoutine({ + thunk: fetchDevicesThunk, + category: Category.DEVICE as CategoryType, + payload: {}, + }) + ) }, }) +const FETCH_DEVICES_INTERVAL = 15000 // in ms export const fetchDevicesThunk = createAsyncThunk(FETCH_DEVICE_ACTION, (_, thunkApi) => { const { user } = thunkApi.getState() as RootState diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index f705aa4eb..6bd702bf7 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,13 +1,15 @@ import { faGripVertical } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { GridLayout } from '@layout/grid.layout/grid.layout'; +import UpdateIndicator from '@layout/grid.layout/update-inidicator.layout/update-indicator.layout'; +import { Category, CategoryType } from '@shared/types/category.type'; import { useRef } from 'react'; import { Button, Col, Container, Form, Nav, NavLink, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; import { useDeviceViewModel } from '../view_model/device.viewmodel'; import './device.scss'; import { DeviceViewTable } from './device.view.table'; -import { DeviceViewTabs, DeviceViewTabValues } from './device.view.tabs'; +import { DeviceViewTabValues, DeviceViewTabs } from './device.view.tabs'; const DeviceView = () => { const { t } = useTranslation('common'); @@ -20,13 +22,16 @@ const DeviceView = () => { <> <div key="device-list"> <Container className='c-box hoverable h-100'> + <UpdateIndicator + category={Category.DEVICE as CategoryType} + updateInterval={15000} + /> <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row> <Col sm={12} className='mt-4'> <h3 className='text-black-50'>{t('device.title')}</h3> </Col> </Row> - <Row className='align-items-center'> <Col xs={12} sm={6}> <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> @@ -48,6 +53,10 @@ const DeviceView = () => { <div key="device-details"> <Container className='c-box hoverable h-100'> + <UpdateIndicator + category={Category.TAB as CategoryType} + updateInterval={5000} + /> <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row> <Col xs={12} className='mt-4'> @@ -67,7 +76,6 @@ const DeviceView = () => { </Nav> </Col> </Row> - <Row className='align-items-start'> <Col xs={12}> {DeviceViewTabs(activeTab)} diff --git a/react-ui/src/components/devices/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts index 9a0fbe17a..1cce2d59a 100755 --- a/react-ui/src/components/devices/view_model/device.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.viewmodel.ts @@ -7,7 +7,7 @@ export const useDeviceViewModel = () => { const { activeTab } = useAppSelector((state) => state.device) const dispatch = useAppDispatch() - useEffect(() => {}, []) + useEffect(() => { }, []) const handleActiveTabLink = (tabLink: DeviceViewTabValues) => { return activeTab === tabLink ? 'active' : '' diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index fb3ca729c..53444b9e0 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -53,6 +53,9 @@ "yang_model": { "title": "YANG Model" } + }, + "box": { + "lastUpdate": "Last updated {{seconds}} seconds ago" } }, "protected": { diff --git a/react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.layout.tsx b/react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.layout.tsx new file mode 100644 index 000000000..d71bb6cce --- /dev/null +++ b/react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.layout.tsx @@ -0,0 +1,52 @@ +import { faCircle } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import React, { useState } from 'react' +import { Overlay, Tooltip } from 'react-bootstrap' +import { useTranslation } from 'react-i18next' +import { CategoryType } from '../types' +import { useUpdateIndicatorViewModel } from './update-indicator.viewmodel' + +interface UpdateIndicatorProps { + category: CategoryType + updateInterval: number +} + +const UpdateIndicator: React.FC<UpdateIndicatorProps> = ({ category, updateInterval }) => { + const [showTooltip, setShowTooltip] = useState(false) + const { t } = useTranslation('common') + const target = React.useRef(null) + const { secondsSinceUpdate, getStatusColor } = useUpdateIndicatorViewModel(category) + + return ( + <div + className="position-absolute" + style={{ + top: 0, + right: '40px', + padding: '10px', + zIndex: 10 + }} + > + <div + ref={target} + onMouseEnter={() => setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + style={{ cursor: 'pointer' }} + > + <FontAwesomeIcon + icon={faCircle} + className={getStatusColor(updateInterval)} + size="sm" + /> + </div> + + <Overlay target={target.current} show={showTooltip} placement="bottom"> + <Tooltip id="update-tooltip"> + {t('device.box.lastUpdate', { seconds: secondsSinceUpdate })} + </Tooltip> + </Overlay> + </div> + ) +} + +export default UpdateIndicator \ No newline at end of file diff --git a/react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.viewmodel.tsx b/react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.viewmodel.tsx new file mode 100644 index 000000000..bb91b0b17 --- /dev/null +++ b/react-ui/src/shared/layouts/grid.layout/update-inidicator.layout/update-indicator.viewmodel.tsx @@ -0,0 +1,39 @@ +import { useAppSelector } from "@hooks" +import { CategoryType } from "@shared/types/category.type" +import { useEffect, useState } from 'react' + +export const useUpdateIndicatorViewModel = (category: CategoryType) => { + const { thunks } = useAppSelector((state) => state.routine) + const [secondsSinceUpdate, setSecondsSinceUpdate] = useState<number>(-1) + + useEffect(() => { + const updateTimer = () => { + const lastupdate = thunks[category]?.lastupdate + if (lastupdate) { + setSecondsSinceUpdate(Math.round((Date.now() - lastupdate) / 1000)) + } else { + setSecondsSinceUpdate(-1) + } + } + + // Initial update + updateTimer() + + // Set up interval for updates + const intervalId = setInterval(updateTimer, 1000) + + return () => clearInterval(intervalId) + }, [category, thunks]) + + const getStatusColor = (updateInterval: number) => { + const updateIntervalSeconds = updateInterval / 1000 + if (secondsSinceUpdate > updateIntervalSeconds * 0.9) return "text-primary" + if (secondsSinceUpdate > updateIntervalSeconds * 1.3) return "text-danger" + return "text-bg-primary" + } + + return { + secondsSinceUpdate, + getStatusColor + } +} \ No newline at end of file diff --git a/react-ui/src/shared/reducer/routine.reducer.ts b/react-ui/src/shared/reducer/routine.reducer.ts index 5e9c3401a..95d5f06e7 100755 --- a/react-ui/src/shared/reducer/routine.reducer.ts +++ b/react-ui/src/shared/reducer/routine.reducer.ts @@ -16,6 +16,7 @@ const initialState: ReducerState = { TABLE: null, TAB: null }, + } @@ -27,19 +28,24 @@ const RoutineSlice = createSlice({ const thunk: ThunkPersist = { category: payload.category, payload: payload.payload, - thunkId: payload.thunk.id + thunkId: payload.thunk.id, + lastupdate: Date.now() } state.thunks[payload.category] = thunk }, + refreshUpdateTimer: (state: any, { payload }: PayloadAction<CategoryType>) => { + state.thunks[payload].lastupdate = Date.now() + }, + removeAll: (state) => { state.thunks = initialState.thunks }, }, }) -export const { addRoutine } = RoutineSlice.actions +export const { addRoutine, refreshUpdateTimer } = RoutineSlice.actions // on logout remove all routine startListening({ diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss index 29c971f86..4469a4a5b 100755 --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -2,7 +2,7 @@ $theme-colors: ( "primary": #b350e0, "primary::hover": #ddaff3af, "bg-primary": #ededed, - "danger": #ffdcdc, + "danger": #ff0000, "warning": #dbd116, "dark": #595959, "black": #000000 diff --git a/react-ui/src/shared/types/thunk.type.ts b/react-ui/src/shared/types/thunk.type.ts index 9143871f0..ff037d796 100644 --- a/react-ui/src/shared/types/thunk.type.ts +++ b/react-ui/src/shared/types/thunk.type.ts @@ -19,5 +19,6 @@ export interface ThunkDTO { export interface ThunkPersist { thunkId: number, payload: Object - category: CategoryType + category: CategoryType, + lastupdate: number } -- GitLab From 9ea9058872cf7fb13844555af94bd7cecaafcc26 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 20 Jan 2025 10:22:43 +0100 Subject: [PATCH 62/78] Merge branch 'master' into ui-implement-metadata-screen --- .cobra.yaml | 0 .devcontainer/Dockerfile | 0 .devcontainer/devcontainer.json | 0 .dockerignore | 0 .editorconfig | 0 .gitignore | 0 .gitlab-ci.yml | 0 .gitlab/ci/.build-binaries.yml | 0 .gitlab/ci/.build-container-images.yml | 0 .gitlab/ci/.code-quality-ci.yml | 0 .gitlab/ci/.mk-docs-deploy.yml | 0 .gitlab/ci/.react-ui.yml | 3 + .gitlab/ci/.release-container.yml | 0 .gitlab/ci/.renovate.yml | 0 .gitlab/ci/.security-and-compliance-ci.yml | 0 .gitlab/ci/.test.yml | 0 .gitlab/ci/gnmi-cert-integration.Dockerfile | 0 .gitlab/ci/gosdn-integration.Dockerfile | 0 .gitlab/ci/legacy/.test.yml | 0 .gitlab/issue_templates/Change Request.md | 0 .gitlab/issue_templates/Feature Proposal.md | 0 .gitlab/issue_templates/Issue Template.md | 0 .gitlab/merge_request_templates/Default.md | 0 .gitmodules | 0 .golangci.yml | 0 LICENSE | 0 Makefile | 0 README.md | 0 api/LICENSE | 0 api/Makefile | 0 api/README.md | 0 api/buf.gen.yaml | 0 api/buf.work.yaml | 0 api/cmd/gogen.go | 0 api/deps/buf.yaml | 0 .../.github/workflows/ci-cpp-build-gnmi.yml | 0 .../github.com/openconfig/gnmi/BUILD.bazel | 0 .../openconfig/gnmi/CONTRIBUTING.md | 0 api/deps/github.com/openconfig/gnmi/LICENSE | 0 api/deps/github.com/openconfig/gnmi/README.md | 0 .../openconfig/gnmi/WORKSPACE.bazel | 0 .../github.com/openconfig/gnmi/cache/cache.go | 0 .../openconfig/gnmi/cache/cache_test.go | 0 .../github.com/openconfig/gnmi/cli/cli.go | 0 .../openconfig/gnmi/cli/cli_test.go | 0 .../openconfig/gnmi/client/cache.go | 0 .../openconfig/gnmi/client/cache_test.go | 0 .../openconfig/gnmi/client/client.go | 0 .../openconfig/gnmi/client/client_test.go | 0 .../openconfig/gnmi/client/fake/fake.go | 0 .../openconfig/gnmi/client/fake/fake_test.go | 0 .../gnmi/client/flags/flags_test.go | 0 .../openconfig/gnmi/client/flags/intmap.go | 0 .../gnmi/client/flags/stringlist.go | 0 .../openconfig/gnmi/client/flags/stringmap.go | 0 .../openconfig/gnmi/client/gnmi/client.go | 0 .../gnmi/client/gnmi/client_test.go | 0 .../gnmi/client/gnmi/credentials.go | 0 .../openconfig/gnmi/client/grpcutil/lookup.go | 0 .../gnmi/client/grpcutil/lookup_test.go | 0 .../openconfig/gnmi/client/notification.go | 0 .../openconfig/gnmi/client/query.go | 0 .../openconfig/gnmi/client/reconnect.go | 0 .../openconfig/gnmi/client/reconnect_test.go | 0 .../openconfig/gnmi/client/register.go | 0 .../openconfig/gnmi/client/values.go | 0 .../openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go | 0 .../gnmi/cmd/gnmi_cli/gnmi_cli_test.go | 0 .../gnmi/cmd/gnmi_collector/docker/Dockerfile | 0 .../gnmi/cmd/gnmi_collector/docker/README.md | 0 .../cmd/gnmi_collector/docker/config/cert.pem | 0 .../gnmi_collector/docker/config/example.cfg | 0 .../cmd/gnmi_collector/docker/config/key.pem | 0 .../gnmi_collector/docker/supervisord.conf | 0 .../gnmi/cmd/gnmi_collector/gnmi_collector.go | 0 .../cmd/gnmi_collector/gnmi_collector_test.go | 0 .../gnmi/cmd/gnmi_collector/testdata/bad.cfg | 0 .../gnmi/cmd/gnmi_collector/testdata/bad.crt | 0 .../gnmi/cmd/gnmi_collector/testdata/bad.key | 0 .../gnmi/cmd/gnmi_collector/testdata/good.cfg | 0 .../gnmi/cmd/gnmi_collector/testdata/good.crt | 0 .../gnmi/cmd/gnmi_collector/testdata/good.key | 0 .../gnmi_collector/testdata/unparseable.cfg | 0 .../openconfig/gnmi/coalesce/coalesce.go | 0 .../openconfig/gnmi/coalesce/coalesce_test.go | 0 .../openconfig/gnmi/collector/collector.go | 0 .../gnmi/collector/collector_test.go | 0 .../openconfig/gnmi/connection/connection.go | 0 .../gnmi/connection/connection_test.go | 0 .../github.com/openconfig/gnmi/ctree/tree.go | 0 .../openconfig/gnmi/ctree/tree_test.go | 0 .../openconfig/gnmi/errdiff/errdiff.go | 0 .../openconfig/gnmi/errdiff/errdiff_test.go | 0 .../openconfig/gnmi/errlist/errlist.go | 0 .../openconfig/gnmi/errlist/errlist_test.go | 0 .../github.com/openconfig/gnmi/gnmi_deps.bzl | 0 api/deps/github.com/openconfig/gnmi/go.mod | 0 api/deps/github.com/openconfig/gnmi/go.sum | 0 .../openconfig/gnmi/latency/latency.go | 0 .../openconfig/gnmi/latency/latency_test.go | 0 .../openconfig/gnmi/manager/manager.go | 0 .../openconfig/gnmi/manager/manager_test.go | 0 .../openconfig/gnmi/manager/meta.go | 0 .../openconfig/gnmi/manager/meta_test.go | 0 .../github.com/openconfig/gnmi/match/match.go | 0 .../openconfig/gnmi/match/match_test.go | 0 .../openconfig/gnmi/metadata/metadata.go | 0 .../openconfig/gnmi/metadata/metadata_test.go | 0 .../yang/gnmi-collector-metadata.yang | 0 .../github.com/openconfig/gnmi/path/path.go | 0 .../openconfig/gnmi/path/path_test.go | 0 .../gnmi/proto/collector/BUILD.bazel | 0 .../gnmi/proto/collector/collector.pb.go | 0 .../gnmi/proto/collector/collector.proto | 0 .../gnmi/proto/collector/collector_grpc.pb.go | 0 .../gnmi/proto/collector/collector_pb2.py | 0 .../proto/collector/collector_pb2_grpc.py | 0 .../openconfig/gnmi/proto/gnmi/BUILD.bazel | 0 .../openconfig/gnmi/proto/gnmi/gnmi.pb.go | 0 .../openconfig/gnmi/proto/gnmi/gnmi.proto | 0 .../gnmi/proto/gnmi/gnmi_grpc.pb.go | 0 .../openconfig/gnmi/proto/gnmi/gnmi_pb2.py | 0 .../gnmi/proto/gnmi/gnmi_pb2_grpc.py | 0 .../gnmi/proto/gnmi_ext/BUILD.bazel | 0 .../gnmi/proto/gnmi_ext/gnmi_ext.pb.go | 0 .../gnmi/proto/gnmi_ext/gnmi_ext.proto | 0 .../gnmi/proto/gnmi_ext/gnmi_ext_pb2.py | 0 .../gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py | 0 .../openconfig/gnmi/proto/target/BUILD.bazel | 0 .../openconfig/gnmi/proto/target/target.pb.go | 0 .../openconfig/gnmi/proto/target/target.proto | 0 .../gnmi/proto/target/target_pb2.py | 0 .../gnmi/proto/target/target_pb2_grpc.py | 0 .../openconfig/gnmi/subscribe/subscribe.go | 0 .../gnmi/subscribe/subscribe_test.go | 0 .../openconfig/gnmi/target/target.go | 0 .../openconfig/gnmi/target/target_test.go | 0 .../gnmi/testing/fake/gnmi/agent.go | 0 .../gnmi/testing/fake/gnmi/client.go | 0 .../fake/gnmi/cmd/fake_server/README.md | 0 .../fake/gnmi/cmd/fake_server/config.pb.txt | 0 .../fake/gnmi/cmd/fake_server/server.go | 0 .../gnmi/cmd/gen_fake_config/gen_config.go | 0 .../gnmi/testing/fake/gnmi/gnmi_test.go | 0 .../gnmi/testing/fake/proto/fake.pb.go | 0 .../gnmi/testing/fake/proto/fake.proto | 0 .../gnmi/testing/fake/proto/fake_grpc.pb.go | 0 .../gnmi/testing/fake/proto/fake_pb2.py | 0 .../gnmi/testing/fake/proto/fake_pb2_grpc.py | 0 .../gnmi/testing/fake/queue/fixed_queue.go | 0 .../gnmi/testing/fake/queue/queue.go | 0 .../gnmi/testing/fake/queue/queue_test.go | 0 .../fake/testing/grpc/config/config_test.go | 0 .../fake/testing/grpc/config/server_option.go | 0 .../gnmi/testing/fake/testing/tls/tls.go | 0 .../gnmi/testing/fake/testing/tls/tls_test.go | 0 .../github.com/openconfig/gnmi/value/value.go | 0 .../openconfig/gnmi/value/value_test.go | 0 .../github.com/openconfig/gnmi/watch/watch.go | 0 .../gnmi/proto/collector/collector.pb.go | 0 .../gnmi/proto/collector/collector_grpc.pb.go | 0 .../openconfig/gnmi/proto/gnmi/gnmi.pb.go | 0 .../gnmi/proto/gnmi/gnmi_grpc.pb.go | 0 .../gnmi/proto/gnmi_ext/gnmi_ext.pb.go | 0 .../openconfig/gnmi/proto/target/target.pb.go | 0 .../gnmi/testing/fake/proto/fake.pb.go | 0 .../gnmi/testing/fake/proto/fake_grpc.pb.go | 0 api/go/gosdn/app/app.pb.go | 0 api/go/gosdn/app/app.pb.gw.go | 0 api/go/gosdn/app/app_grpc.pb.go | 0 .../configurationmanagement.pb.go | 0 .../configurationmanagement.pb.gw.go | 0 .../configurationmanagement_grpc.pb.go | 0 api/go/gosdn/conflict/conflict.pb.go | 0 api/go/gosdn/csbi/csbi.pb.go | 0 api/go/gosdn/csbi/csbi_grpc.pb.go | 0 .../gosdn/networkelement/networkelement.pb.go | 0 .../networkelement/networkelement.pb.gw.go | 0 .../networkelement/networkelement_grpc.pb.go | 0 .../plugin-internal/plugin-internal.pb.go | 0 .../plugin-internal_grpc.pb.go | 0 .../plugin-registry/plugin-registry.pb.go | 0 .../plugin-registry_grpc.pb.go | 0 api/go/gosdn/plugin/plugin.pb.go | 0 api/go/gosdn/plugin/plugin_grpc.pb.go | 0 api/go/gosdn/pnd/pnd.pb.go | 0 api/go/gosdn/pnd/pnd.pb.gw.go | 0 api/go/gosdn/pnd/pnd_grpc.pb.go | 0 api/go/gosdn/rbac/rbac.pb.go | 0 api/go/gosdn/rbac/rbac.pb.gw.go | 0 api/go/gosdn/rbac/rbac_grpc.pb.go | 0 api/go/gosdn/rbac/role.pb.go | 0 api/go/gosdn/rbac/role.pb.gw.go | 0 api/go/gosdn/rbac/role_grpc.pb.go | 0 api/go/gosdn/rbac/user.pb.go | 0 api/go/gosdn/rbac/user.pb.gw.go | 0 api/go/gosdn/rbac/user_grpc.pb.go | 0 api/go/gosdn/southbound/southbound.pb.go | 0 api/go/gosdn/southbound/southbound_grpc.pb.go | 0 .../subscriptionmanagement.pb.go | 0 .../subscriptionmanagement.pb.gw.go | 0 .../subscriptionmanagement_grpc.pb.go | 0 api/go/gosdn/topology/link.pb.go | 0 api/go/gosdn/topology/node.pb.go | 0 api/go/gosdn/topology/port.pb.go | 0 api/go/gosdn/topology/route.pb.go | 0 api/go/gosdn/topology/routingTable.pb.go | 0 api/go/gosdn/topology/routingTable.pb.gw.go | 0 api/go/gosdn/topology/routingTable_grpc.pb.go | 0 api/go/gosdn/topology/topology.pb.go | 0 api/go/gosdn/topology/topology.pb.gw.go | 0 api/go/gosdn/topology/topology_grpc.pb.go | 0 api/go/gosdn/transport/transport.pb.go | 0 api/openapiv2/gosdn_northbound.swagger.json | 0 api/proto/buf.lock | 0 api/proto/buf.yaml | 0 api/proto/gosdn/app/app.proto | 0 .../configurationmanagement.proto | 0 api/proto/gosdn/conflict/conflict.proto | 0 api/proto/gosdn/csbi/csbi.proto | 0 .../gosdn/networkelement/networkelement.proto | 0 .../plugin-internal/plugin-internal.proto | 0 .../plugin-registry/plugin-registry.proto | 0 api/proto/gosdn/plugin/plugin.proto | 0 api/proto/gosdn/pnd/pnd.proto | 0 api/proto/gosdn/rbac/rbac.proto | 0 api/proto/gosdn/rbac/role.proto | 0 api/proto/gosdn/rbac/user.proto | 0 api/proto/gosdn/southbound/southbound.proto | 0 .../subscriptionmanagement.proto | 0 api/proto/gosdn/topology/link.proto | 0 api/proto/gosdn/topology/node.proto | 0 api/proto/gosdn/topology/port.proto | 0 api/proto/gosdn/topology/route.proto | 0 api/proto/gosdn/topology/routingTable.proto | 0 api/proto/gosdn/topology/topology.proto | 0 api/proto/gosdn/transport/transport.proto | 0 api/third_party/validator/validator.proto | 0 application-framework/event/event.go | 0 application-framework/event/eventService.go | 0 application-framework/event/event_test.go | 0 application-framework/event/topics.go | 0 application-framework/event/type.go | 0 .../models/model-handling.go | 0 .../models/model-handling_test.go | 0 .../registration/registration.go | 0 applications/arista-routing-engine/app.go | 0 .../arista-routing-engine.Dockerfile | 0 ...sta-routing-engine.Dockerfile.dockerignore | 0 applications/arista-routing-engine/main.go | 0 .../arista-routing-engine/network-element.go | 0 applications/arista-routing-engine/routing.go | 0 .../basic-interface-monitoring/app.go | 0 .../basic-interface-monitoring/http.go | 0 .../basic-interface-monitoring/main.go | 0 .../network-element.go | 0 .../webpage/index.html | 0 applications/hostname-checker/app.go | 0 applications/hostname-checker/device.go | 0 applications/hostname-checker/main.go | 0 applications/inventory-manager/README.md | 0 .../inventory-manager/config/config.go | 0 applications/inventory-manager/example.yml | 0 .../inventory-manager.Dockerfile | 0 .../inventory-manager.Dockerfile.dockerignore | 0 .../inventoryManager/inventoryManager.go | 0 .../inventoryManager/util.go | 0 applications/inventory-manager/main.go | 0 applications/venv-manager/Readme.md | 0 .../venv-manager/containerlab/containerlab.go | 0 applications/venv-manager/links/link.go | 0 applications/venv-manager/main.go | 0 applications/venv-manager/node/node.go | 0 applications/venv-manager/port/port.go | 0 .../venv-manager/topology/topology.go | 0 .../venv-manager/venv-manager.Dockerfile | 0 .../venv-manager.Dockerfile.dockerignore | 0 .../venv-manager/venv-manager/venv-manager.go | 0 .../venv-manager/yang-parser/yang-parser.go | 0 applications/ws-events/app.go | 0 applications/ws-events/main.go | 0 applications/ws-events/ws-events.Dockerfile | 0 .../ws-events.Dockerfile.dockerignore | 0 applications/ws-events/ws.go | 0 cli/LICENSE | 0 cli/README.md | 0 cli/adapter/PndAdapter.go | 0 cli/adapter/PndAdapter_test.go | 0 cli/build/ci/.security-and-compliance-ci.yml | 0 cli/build/ci/.test.yml | 0 cli/cli.Dockerfile | 0 cli/cli.Dockerfile.dockerignore | 0 cli/cmd/change.go | 0 cli/cmd/changeCommit.go | 0 cli/cmd/changeConfirm.go | 0 cli/cmd/changeGet.go | 0 cli/cmd/changeList.go | 0 cli/cmd/config/.gosdnc.toml | 0 cli/cmd/list.go | 0 cli/cmd/login.go | 0 cli/cmd/logout.go | 0 cli/cmd/networkElement.go | 0 cli/cmd/networkElementCreate.go | 0 cli/cmd/networkElementList.go | 0 cli/cmd/networkElementPath.go | 0 cli/cmd/networkElementPathDelete.go | 0 cli/cmd/networkElementPathGet.go | 0 cli/cmd/networkElementPathGetIntended.go | 0 cli/cmd/networkElementPathSet.go | 0 cli/cmd/networkElementRemove.go | 0 cli/cmd/networkElementShow.go | 0 cli/cmd/networkElementSubscribe.go | 0 cli/cmd/plugin.go | 0 cli/cmd/pluginList.go | 0 cli/cmd/pnd.go | 0 cli/cmd/pndCreate.go | 0 cli/cmd/pndGet.go | 0 cli/cmd/pndList.go | 0 cli/cmd/pndRemove.go | 0 cli/cmd/pndUse.go | 0 cli/cmd/prompt.go | 0 cli/cmd/role.go | 0 cli/cmd/roleCreate.go | 0 cli/cmd/roleGetAll.go | 0 cli/cmd/root.go | 0 cli/cmd/subManagement.go | 0 cli/cmd/subManagementGetAll.go | 0 cli/cmd/subManagementResetAll.go | 0 cli/cmd/user.go | 0 cli/cmd/userCreate.go | 0 cli/cmd/userDelete.go | 0 cli/cmd/userGet.go | 0 cli/cmd/userGetAll.go | 0 cli/cmd/userUpdate.go | 0 cli/cmd/utils.go | 0 cli/cmd/utils_test.go | 0 cli/completer/utils.go | 0 cli/completer/yangSchemaCompleter.go | 0 cli/config/.cobra.yaml | 0 cli/config/gosdnc.toml.example | 0 cli/main.go | 0 .../integrationtest.clab.tmpl.yml | 0 .../integrationtest_branch.clab.tmpl.yml | 0 config.js | 0 controller/ARCHITECTURE.md | 0 controller/CONTRIBUTING.md | 0 controller/Dockerfile.debug | 0 controller/Makefile | 0 controller/README.md | 0 controller/api/apiUtil_test.go | 0 controller/api/api_test.go | 0 controller/api/api_test.toml | 0 controller/api/app.go | 0 controller/api/auth.go | 0 controller/api/auth_test.go | 0 controller/api/change.go | 0 controller/api/configurationManagement.go | 0 controller/api/grpc.go | 0 controller/api/initialise_test.go | 0 controller/api/managedNetworkElement.go | 0 controller/api/plugin.go | 0 controller/api/pnd.go | 0 controller/api/role.go | 0 controller/api/role_test.go | 0 controller/api/subManagement.go | 0 controller/api/user.go | 0 controller/api/user_test.go | 0 controller/app/DatabaseStore.go | 0 controller/app/Service.go | 0 controller/app/app.go | 0 controller/app/store.go | 0 controller/app/utils.go | 0 controller/cmd/gosdn/main.go | 0 controller/cmd/root.go | 0 controller/cmd/version.go | 0 controller/config/config.go | 0 controller/config/config_test.go | 0 controller/config/environment.go | 0 controller/config/gnmiSubscriptionConfig.go | 0 controller/configs/.gitkeep | 0 controller/configs/basic-docker-compose.toml | 0 .../configs/containerlab-gosdn.toml.example | 0 .../configs/development-gosdn.toml.example | 0 .../configs/gNMISubscriptions.txt.example | 0 .../configs/integration-test-gosdn.toml | 0 controller/conflict/versioning.go | 0 controller/controller.Dockerfile | 0 controller/controller.Dockerfile.dockerignore | 0 controller/controller.go | 0 controller/controller_test.go | 0 controller/customerrs/errors.go | 0 controller/event/event.go | 0 controller/event/event_test.go | 0 controller/eventService/Service.go | 0 controller/eventService/utils.go | 0 controller/http.go | 0 controller/http_test.go | 0 controller/initialise_test.go | 0 controller/interfaces/change/change.go | 0 controller/interfaces/event/service.go | 0 controller/interfaces/networkdomain/pnd.go | 0 .../interfaces/networkdomain/pndService.go | 0 .../interfaces/networkdomain/pndStore.go | 0 .../networkelement/networkElement.go | 0 .../networkelement/networkElementService.go | 0 .../networkelement/networkElementStore.go | 0 controller/interfaces/plugin/plugin.go | 0 controller/interfaces/plugin/pluginService.go | 0 controller/interfaces/plugin/pluginStore.go | 0 controller/interfaces/rbac/rbacService.go | 0 controller/interfaces/rbac/role.go | 0 controller/interfaces/rbac/roleStore.go | 0 controller/interfaces/rbac/user.go | 0 controller/interfaces/rbac/userStore.go | 0 controller/interfaces/store/store.go | 0 controller/interfaces/transport/transport.go | 0 controller/metrics/prometheus.go | 0 controller/mocks/Change.go | 0 controller/mocks/Csbi.go | 0 controller/mocks/Device.go | 0 controller/mocks/GNMIClient.go | 0 controller/mocks/GNMIServer.go | 0 controller/mocks/GNMI_SubscribeClient.go | 0 controller/mocks/GNMI_SubscribeServer.go | 0 controller/mocks/GenericGoStructClient.go | 0 controller/mocks/HandleSubscribeResponse.go | 0 controller/mocks/NetworkDomain.go | 0 controller/mocks/NetworkElement.go | 0 controller/mocks/Plugin.go | 0 .../mocks/PluginRegistryServiceClient.go | 0 controller/mocks/Plugin_additions.go | 0 controller/mocks/PndService.go | 0 controller/mocks/PndStore.go | 0 controller/mocks/Pnd_Additions.go | 0 controller/mocks/Role.go | 0 controller/mocks/RoleService.go | 0 controller/mocks/RoleStore.go | 0 controller/mocks/Service.go | 0 controller/mocks/Storable.go | 0 controller/mocks/Store.go | 0 controller/mocks/Transport.go | 0 controller/mocks/UnsafeGNMIServer.go | 0 controller/mocks/User.go | 0 controller/mocks/UserService.go | 0 controller/mocks/UserStore.go | 0 .../mocks/isSubscribeRequest_Request.go | 0 .../mocks/isSubscribeResponse_Response.go | 0 controller/mocks/isTypedValue_Value.go | 0 controller/northbound/client/app.go | 0 .../client/configurationManagement.go | 0 .../northbound/client/networkElement.go | 0 controller/northbound/client/plugin.go | 0 controller/northbound/client/pnd.go | 0 controller/northbound/client/rbac.go | 0 controller/northbound/client/sbi.go | 0 controller/northbound/client/submanagement.go | 0 controller/northbound/server/app.go | 0 controller/northbound/server/auth.go | 0 .../northbound/server/auth_interceptor.go | 0 .../server/auth_interceptor_test.go | 0 controller/northbound/server/auth_test.go | 0 .../server/configurationmanagement.go | 0 controller/northbound/server/csbi.go | 0 controller/northbound/server/metrics.go | 0 controller/northbound/server/nbi.go | 0 .../northbound/server/networkElement.go | 0 .../northbound/server/networkElement_test.go | 0 controller/northbound/server/plugin.go | 0 controller/northbound/server/pnd.go | 0 controller/northbound/server/pnd_test.go | 0 controller/northbound/server/role.go | 0 controller/northbound/server/role_test.go | 0 controller/northbound/server/route.go | 0 controller/northbound/server/submanagement.go | 0 .../northbound/server/test_util_test.go | 0 controller/northbound/server/topology.go | 0 controller/northbound/server/topology_test.go | 0 controller/northbound/server/user.go | 0 controller/northbound/server/user_test.go | 0 controller/northbound/server/utils_test.go | 0 controller/nucleus/change.go | 0 controller/nucleus/change_test.go | 0 controller/nucleus/clientConfig.go | 0 .../nucleus/database/mongo-connection.go | 0 .../nucleus/databaseNetworkElementStore.go | 0 controller/nucleus/databasePluginStore.go | 0 controller/nucleus/databasePndStore.go | 0 controller/nucleus/genericService.go | 0 controller/nucleus/gnmi_transport.go | 0 controller/nucleus/gnmi_transport_test.go | 0 controller/nucleus/initialise_test.go | 0 .../nucleus/memoryNetworkElementStore.go | 0 controller/nucleus/memoryPluginStore.go | 0 controller/nucleus/memoryPndStore.go | 0 controller/nucleus/networkElement.go | 0 .../nucleus/networkElementFilesystemStore.go | 0 .../networkElementFilesystemStore_test.go | 0 controller/nucleus/networkElementService.go | 0 .../nucleus/networkElementServiceMock.go | 0 .../nucleus/networkElementService_test.go | 0 controller/nucleus/networkElementStore.go | 0 controller/nucleus/networkElementWatcher.go | 0 controller/nucleus/networkElement_test.go | 0 controller/nucleus/plugin.go | 0 controller/nucleus/pluginFilesystemStore.go | 0 .../nucleus/pluginFilesystemStore_test.go | 0 controller/nucleus/pluginService.go | 0 controller/nucleus/pluginServiceMock.go | 0 controller/nucleus/pluginStore.go | 0 controller/nucleus/plugin_test.go | 0 controller/nucleus/pndFilesystemStore.go | 0 controller/nucleus/pndFilesystemStore_test.go | 0 controller/nucleus/pndService.go | 0 controller/nucleus/pndStore.go | 0 controller/nucleus/principalNetworkDomain.go | 0 .../nucleus/principalNetworkDomain_test.go | 0 controller/nucleus/restconf_transport.go | 0 controller/nucleus/restconf_transport_test.go | 0 .../nucleus/subscriptionQueueHandler.go | 0 controller/nucleus/transport.go | 0 controller/nucleus/transport_test.go | 0 controller/nucleus/types/types.go | 0 controller/nucleus/util/gnmi/convert.go | 0 controller/nucleus/util/gnmi/notification.go | 0 controller/nucleus/util/path/translate.go | 0 controller/nucleus/util/path/traverse.go | 0 controller/nucleus/util/path/traverse_test.go | 0 controller/nucleus/util/plugin.go | 0 controller/nucleus/util/proto/message.go | 0 controller/nucleus/util/proto/message_test.go | 0 controller/plugin/shared/client.go | 0 controller/plugin/shared/interface.go | 0 controller/plugin/shared/server.go | 0 controller/plugin/shared/util.go | 0 controller/rbac/databaseRoleStore.go | 0 controller/rbac/databaseUserStore.go | 0 controller/rbac/jwtManager.go | 0 controller/rbac/jwtManager_test.go | 0 controller/rbac/memoryRoleStore.go | 0 controller/rbac/memoryUserStore.go | 0 controller/rbac/rbacService.go | 0 controller/rbac/rbacTestUtil_test.go | 0 controller/rbac/role.go | 0 controller/rbac/roleFileSystemStore.go | 0 controller/rbac/roleFileSystemStore_test.go | 0 controller/rbac/roleStore.go | 0 controller/rbac/user.go | 0 controller/rbac/userFileSystemStore.go | 0 controller/rbac/userFileSystemStore_test.go | 0 controller/rbac/userStore.go | 0 controller/store/changeStores.go | 0 controller/store/filesystem-settings.go | 0 controller/store/genericStore.go | 0 controller/store/initialise_test.go | 0 controller/store/oldGenericStore.go | 0 controller/store/query.go | 0 controller/store/storageMode.go | 0 controller/store/utils.go | 0 .../test/arista-interface-response.json | 0 .../test/arista-interface-response2.json | 0 controller/test/arista-root-response.json | 0 .../containerlab/complex-1.0.clab.tmpl.yml | 0 controller/test/containerlab/complex-1.0.png | Bin .../test/containerlab/dev.clab.tmpl.yml | 0 .../test/containerlab/int01.clab.tmpl.yml | 0 controller/test/plugin/csbiAdditions.go | 0 .../test/plugin/faulty/csbiAdditions.go | 0 controller/test/plugin/faulty/gostructs.go | 0 controller/test/plugin/faulty/plugin.yml | 0 controller/test/plugin/gostructs.go | 0 controller/test/plugin/plugin.yml | 0 controller/test/proto/cap-resp-arista-ceos | 0 controller/test/proto/req-full-node | 0 .../test/proto/req-full-node-arista-ceos | Bin .../test/proto/req-interfaces-arista-ceos | 0 .../req-interfaces-interface-arista-ceos | 0 controller/test/proto/req-interfaces-wildcard | 0 controller/test/proto/resp-full-node | 0 .../test/proto/resp-full-node-arista-ceos | Bin .../test/proto/resp-interfaces-arista-ceos | 0 .../resp-interfaces-interface-arista-ceos | 0 .../test/proto/resp-interfaces-wildcard | 0 .../proto/resp-set-system-config-hostname | 0 controller/test/targets.go | 0 controller/test/terraform/.docker/ca.pem | 0 controller/test/terraform/.docker/cert.pem | 0 .../test/terraform/.docker/server-cert.pem | 0 controller/test/terraform/containers.tf | 0 controller/test/terraform/images.tf | 0 controller/test/terraform/main.tf | 0 controller/test/terraform/providers.tf | 0 controller/test/terraform/resources.tf | 0 controller/test/terraform/variables.tf | 0 controller/test/yang/test-module.go | 0 controller/test/yang/test.yang | 0 controller/test/yang/yang.go | 0 controller/topology/links/link.go | 0 .../topology/nodes/databaseNodeStore.go | 0 controller/topology/nodes/node.go | 0 controller/topology/nodes/nodeService.go | 0 controller/topology/nodes/nodeService_test.go | 0 controller/topology/nodes/store.go | 0 .../ports/configuration/configuration.go | 0 controller/topology/ports/port.go | 0 controller/topology/ports/portService.go | 0 controller/topology/ports/portService_test.go | 0 controller/topology/ports/portStore.go | 0 controller/topology/ports/store.go | 0 controller/topology/routing-tables/route.go | 0 .../topology/routing-tables/routingTable.go | 0 .../routing-tables/routingTableService.go | 0 .../routingTableService_test.go | 0 .../routing-tables/routingTableStore.go | 0 controller/topology/routing-tables/store.go | 0 controller/topology/store.go | 0 controller/topology/store/genericStore.go | 0 .../topology/store/genericStore_test.go | 0 controller/topology/store/query.go | 0 controller/topology/topology.go | 0 controller/topology/topologyService.go | 0 controller/topology/topologyService_test.go | 0 controller/topology/topologyStore.go | 0 controller/version/version.go | 0 controller/version/version_test.go | 0 csbi/.csbi.yaml | 0 csbi/Dockerfile.exec | 0 csbi/LICENSE | 0 csbi/README.md | 0 csbi/arista.capabilities | 0 csbi/build.go | 0 csbi/build/ci/.build-container.yml | 0 csbi/build/ci/.code-quality-ci.yml | 0 csbi/build/ci/.golangci-config/.golangci.yml | 0 csbi/build/ci/.security-and-compliance-ci.yml | 0 csbi/build/ci/.test.yml | 0 csbi/build_test.go | 0 csbi/cmd/csbi/main.go | 0 csbi/cmd/debug/main.go | 0 csbi/cmd/demo/main.go | 0 csbi/cmd/deploy.go | 0 csbi/cmd/discover.go | 0 csbi/cmd/executor/executor.go | 0 csbi/cmd/executor/experiment.yaml | 0 csbi/cmd/generate.go | 0 csbi/cmd/hello.go | 0 csbi/cmd/init.go | 0 csbi/cmd/repository.go | 0 csbi/cmd/root.go | 0 csbi/config/config.go | 0 csbi/csbi.Dockerfile | 0 csbi/csbi.Dockerfile.dockerignore | 0 csbi/deployment.go | 0 csbi/deployment_test.go | 0 csbi/discover.go | 0 csbi/discover_test.go | 0 csbi/docker-compose.yml | 0 csbi/generate.go | 0 csbi/generate_test.go | 0 csbi/gnmi-target/gnmitarget.Dockerfile | 0 .../gnmitarget.Dockerfile.dockerignore | 0 .../datasources/prometheus_ds.yml | 0 csbi/grpc.go | 0 csbi/grpc_test.go | 0 csbi/http.go | 0 csbi/http_test.go | 0 csbi/metrics.go | 0 csbi/model.go | 0 csbi/orchestrator.go | 0 csbi/orchestrator_test.go | 0 csbi/prometheus/alerts.yml | 0 csbi/prometheus/prometheus.yml | 0 csbi/report.xml | 0 csbi/repository.go | 0 csbi/repository_test.go | 0 csbi/resources/Dockerfile | 0 csbi/resources/config.yaml | 0 csbi/resources/csbi.go | 0 csbi/resources/csbiAdditions.go | 0 csbi/resources/go.mod | 0 csbi/resources/go.sum | 0 csbi/resources/gostructs.go | 0 csbi/run.go | 0 csbi/run_test.go | 0 csbi/templates.go | 0 csbi/test.clab.yml | 0 .../gostructs.go | 0 .../experimental/eos/models/arista-cli.yang | 0 .../eos/models/arista-eos-types.yang | 0 .../eos/models/arista-exp-eos.yang | 0 .../eos/models/cert/arista-gnoi-cert.yang | 0 .../eos/models/evpn/arista-exp-eos-evpn.yang | 0 .../arista-exp-eos-igmpsnooping.yang | 0 .../arista-exp-eos-l2protocolforwarding.yang | 0 .../eos/models/mlag/arista-exp-eos-mlag.yang | 0 .../multicast/arista-exp-eos-multicast.yang | 0 .../models/openconfig-component-counters.yang | 0 .../qos/arista-exp-eos-qos-acl-config.yang | 0 .../models/qos/arista-exp-eos-qos-config.yang | 0 .../eos/models/qos/arista-exp-eos-qos.yang | 0 .../eos/models/rpc/arista-rpc-netconf.yang | 0 .../models/varp/arista-exp-eos-varp-intf.yang | 0 .../varp/arista-exp-eos-varp-net-inst.yang | 0 .../eos/models/vlan/vlan-translation.yang | 0 .../vxlan/arista-exp-eos-vxlan-config.yang | 0 .../models/vxlan/arista-exp-eos-vxlan.yang | 0 .../models/openconfig/hercules/LICENSE | 0 .../yang/openconfig-hercules-interfaces.yang | 0 .../openconfig-hercules-platform-chassis.yang | 0 ...openconfig-hercules-platform-linecard.yang | 0 .../openconfig-hercules-platform-node.yang | 0 .../openconfig-hercules-platform-port.yang | 0 .../yang/openconfig-hercules-platform.yang | 0 .../yang/openconfig-hercules-qos.yang | 0 .../hercules/yang/openconfig-hercules.yang | 0 .../testdata/models/openconfig/public/LICENSE | 0 .../openconfig/public/release/README.md | 0 .../public/release/models/acl/.spec.yml | 0 .../release/models/acl/openconfig-acl.yang | 0 .../acl/openconfig-packet-match-types.yang | 0 .../models/acl/openconfig-packet-match.yang | 0 .../public/release/models/aft/.spec.yml | 0 .../models/aft/openconfig-aft-common.yang | 0 .../models/aft/openconfig-aft-ethernet.yang | 0 .../models/aft/openconfig-aft-ipv4.yang | 0 .../models/aft/openconfig-aft-ipv6.yang | 0 .../models/aft/openconfig-aft-mpls.yang | 0 .../aft/openconfig-aft-network-instance.yang | 0 .../release/models/aft/openconfig-aft-pf.yang | 0 .../models/aft/openconfig-aft-types.yang | 0 .../release/models/aft/openconfig-aft.yang | 0 .../public/release/models/bfd/.spec.yml | 0 .../release/models/bfd/openconfig-bfd.yang | 0 .../public/release/models/bgp/.spec.yml | 0 .../openconfig-bgp-common-multiprotocol.yang | 0 .../bgp/openconfig-bgp-common-structure.yang | 0 .../models/bgp/openconfig-bgp-common.yang | 0 .../models/bgp/openconfig-bgp-errors.yang | 0 .../models/bgp/openconfig-bgp-global.yang | 0 .../models/bgp/openconfig-bgp-neighbor.yang | 0 .../models/bgp/openconfig-bgp-peer-group.yang | 0 .../models/bgp/openconfig-bgp-policy.yang | 0 .../models/bgp/openconfig-bgp-types.yang | 0 .../release/models/bgp/openconfig-bgp.yang | 0 .../public/release/models/catalog/.spec.yml | 0 .../catalog/openconfig-catalog-types.yang | 0 .../catalog/openconfig-module-catalog.yang | 0 .../public/release/models/firewall/.spec.yml | 0 .../openconfig-fw-high-availability.yang | 0 .../openconfig-fw-link-monitoring.yang | 0 .../release/models/interfaces/.spec.yml | 0 .../interfaces/openconfig-if-8021x.yang | 0 .../interfaces/openconfig-if-aggregate.yang | 0 .../openconfig-if-ethernet-ext.yang | 0 .../interfaces/openconfig-if-ethernet.yang | 0 .../interfaces/openconfig-if-ip-ext.yang | 0 .../models/interfaces/openconfig-if-ip.yang | 0 .../models/interfaces/openconfig-if-poe.yang | 0 .../interfaces/openconfig-if-sdn-ext.yang | 0 .../interfaces/openconfig-if-tunnel.yang | 0 .../interfaces/openconfig-if-types.yang | 0 .../interfaces/openconfig-interfaces.yang | 0 .../public/release/models/isis/.spec.yml | 0 .../isis/openconfig-isis-lsdb-types.yang | 0 .../models/isis/openconfig-isis-lsp.yang | 0 .../models/isis/openconfig-isis-policy.yang | 0 .../models/isis/openconfig-isis-routing.yang | 0 .../models/isis/openconfig-isis-types.yang | 0 .../release/models/isis/openconfig-isis.yang | 0 .../public/release/models/lacp/.spec.yml | 0 .../release/models/lacp/openconfig-lacp.yang | 0 .../public/release/models/lldp/.spec.yml | 0 .../models/lldp/openconfig-lldp-types.yang | 0 .../release/models/lldp/openconfig-lldp.yang | 0 .../release/models/local-routing/.spec.yml | 0 .../openconfig-local-routing.yang | 0 .../public/release/models/macsec/.spec.yml | 0 .../macsec/openconfig-macsec-types.yang | 0 .../models/macsec/openconfig-macsec.yang | 0 .../public/release/models/mpls/.spec.yml | 0 .../models/mpls/openconfig-mpls-igp.yang | 0 .../models/mpls/openconfig-mpls-ldp.yang | 0 .../models/mpls/openconfig-mpls-rsvp.yang | 0 .../models/mpls/openconfig-mpls-sr.yang | 0 .../models/mpls/openconfig-mpls-static.yang | 0 .../models/mpls/openconfig-mpls-te.yang | 0 .../models/mpls/openconfig-mpls-types.yang | 0 .../release/models/mpls/openconfig-mpls.yang | 0 .../public/release/models/multicast/.spec.yml | 0 .../multicast/openconfig-igmp-types.yang | 0 .../models/multicast/openconfig-igmp.yang | 0 .../multicast/openconfig-pim-types.yang | 0 .../models/multicast/openconfig-pim.yang | 0 .../release/models/network-instance/.spec.yml | 0 .../openconfig-network-instance-l2.yang | 0 .../openconfig-network-instance-l3.yang | 0 .../openconfig-network-instance-policy.yang | 0 .../openconfig-network-instance-types.yang | 0 .../openconfig-network-instance.yang | 0 .../release/models/openconfig-extensions.yang | 0 .../public/release/models/openflow/.spec.yml | 0 .../openflow/openconfig-openflow-types.yang | 0 .../models/openflow/openconfig-openflow.yang | 0 .../models/optical-transport/.spec.yml | 0 .../openconfig-channel-monitor.yang | 0 .../openconfig-optical-amplifier.yang | 0 .../openconfig-optical-attenuator.yang | 0 .../openconfig-terminal-device.yang | 0 .../openconfig-transport-line-common.yang | 0 ...penconfig-transport-line-connectivity.yang | 0 .../openconfig-transport-line-protection.yang | 0 .../openconfig-transport-types.yang | 0 .../openconfig-wavelength-router.yang | 0 .../public/release/models/ospf/.spec.yml | 0 .../models/ospf/openconfig-ospf-policy.yang | 0 .../models/ospf/openconfig-ospf-types.yang | 0 .../openconfig-ospfv2-area-interface.yang | 0 .../models/ospf/openconfig-ospfv2-area.yang | 0 .../models/ospf/openconfig-ospfv2-common.yang | 0 .../models/ospf/openconfig-ospfv2-global.yang | 0 .../models/ospf/openconfig-ospfv2-lsdb.yang | 0 .../models/ospf/openconfig-ospfv2.yang | 0 .../public/release/models/p4rt/.spec.yml | 0 .../release/models/p4rt/openconfig-p4rt.yang | 0 .../public/release/models/platform/.spec.yml | 0 .../platform/openconfig-platform-cpu.yang | 0 .../platform/openconfig-platform-ext.yang | 0 .../platform/openconfig-platform-fan.yang | 0 .../openconfig-platform-linecard.yang | 0 ...openconfig-platform-pipeline-counters.yang | 0 .../platform/openconfig-platform-port.yang | 0 .../platform/openconfig-platform-psu.yang | 0 .../openconfig-platform-software.yang | 0 .../openconfig-platform-transceiver.yang | 0 .../platform/openconfig-platform-types.yang | 0 .../models/platform/openconfig-platform.yang | 0 .../models/policy-forwarding/.spec.yml | 0 .../openconfig-pf-forwarding-policies.yang | 0 .../openconfig-pf-interfaces.yang | 0 .../openconfig-pf-path-groups.yang | 0 .../policy-forwarding/openconfig-pf-srte.yang | 0 .../openconfig-policy-forwarding.yang | 0 .../public/release/models/policy/.spec.yml | 0 .../policy/openconfig-policy-types.yang | 0 .../policy/openconfig-routing-policy.yang | 0 .../public/release/models/probes/.spec.yml | 0 .../probes/openconfig-probes-types.yang | 0 .../models/probes/openconfig-probes.yang | 0 .../public/release/models/qos/.spec.yml | 0 .../models/qos/openconfig-qos-elements.yang | 0 .../models/qos/openconfig-qos-interfaces.yang | 0 .../models/qos/openconfig-qos-types.yang | 0 .../release/models/qos/openconfig-qos.yang | 0 .../release/models/relay-agent/.spec.yml | 0 .../relay-agent/openconfig-relay-agent.yang | 0 .../public/release/models/rib/.spec.yml | 0 .../rib/openconfig-rib-bgp-attributes.yang | 0 .../models/rib/openconfig-rib-bgp-ext.yang | 0 .../openconfig-rib-bgp-shared-attributes.yang | 0 .../openconfig-rib-bgp-table-attributes.yang | 0 .../models/rib/openconfig-rib-bgp-tables.yang | 0 .../models/rib/openconfig-rib-bgp-types.yang | 0 .../models/rib/openconfig-rib-bgp.yang | 0 .../public/release/models/sampling/.spec.yml | 0 .../sampling/openconfig-sampling-sflow.yang | 0 .../release/models/segment-routing/.spec.yml | 0 .../openconfig-rsvp-sr-ext.yang | 0 .../openconfig-segment-routing-types.yang | 0 .../openconfig-segment-routing.yang | 0 .../openconfig-srte-policy.yang | 0 .../public/release/models/stp/.spec.yml | 0 .../stp/openconfig-spanning-tree-types.yang | 0 .../models/stp/openconfig-spanning-tree.yang | 0 .../public/release/models/system/.spec.yml | 0 .../models/system/openconfig-aaa-radius.yang | 0 .../models/system/openconfig-aaa-tacacs.yang | 0 .../models/system/openconfig-aaa-types.yang | 0 .../release/models/system/openconfig-aaa.yang | 0 .../models/system/openconfig-alarm-types.yang | 0 .../models/system/openconfig-alarms.yang | 0 .../models/system/openconfig-license.yang | 0 .../models/system/openconfig-messages.yang | 0 .../models/system/openconfig-procmon.yang | 0 .../system/openconfig-system-logging.yang | 0 .../system/openconfig-system-management.yang | 0 .../system/openconfig-system-terminal.yang | 0 .../models/system/openconfig-system.yang | 0 .../public/release/models/telemetry/.spec.yml | 0 .../telemetry/openconfig-telemetry-types.yang | 0 .../telemetry/openconfig-telemetry.yang | 0 .../public/release/models/types/.spec.yml | 0 .../models/types/openconfig-inet-types.yang | 0 .../models/types/openconfig-types.yang | 0 .../models/types/openconfig-yang-types.yang | 0 .../public/release/models/vlan/.spec.yml | 0 .../models/vlan/openconfig-vlan-types.yang | 0 .../release/models/vlan/openconfig-vlan.yang | 0 .../public/release/models/wifi/.spec.yml | 0 .../public/release/models/wifi/README.md | 0 .../models/wifi/openconfig-access-points.yang | 0 .../models/wifi/openconfig-ap-interfaces.yang | 0 .../models/wifi/openconfig-ap-manager.yang | 0 .../models/wifi/openconfig-wifi-mac.yang | 0 .../models/wifi/openconfig-wifi-phy.yang | 0 .../models/wifi/openconfig-wifi-types.yang | 0 .../models/acl/arista-acl-deviations.yang | 0 .../models/aft/arista-aft-augments.yang | 0 .../models/bfd/arista-bfd-augments.yang | 0 .../models/bfd/arista-bfd-deviations.yang | 0 .../models/bgp/arista-bgp-augments.yang | 0 .../models/bgp/arista-bgp-deviations.yang | 0 .../interfaces/arista-intf-augments.yang | 0 .../interfaces/arista-intf-deviations.yang | 0 .../models/isis/arista-isis-augments.yang | 0 .../models/isis/arista-isis-deviations.yang | 0 .../models/lacp/arista-lacp-augments.yang | 0 .../models/lacp/arista-lacp-deviations.yang | 0 .../models/lldp/arista-lldp-augments.yang | 0 .../models/lldp/arista-lldp-deviations.yang | 0 .../arista-local-routing-deviations.yang | 0 .../models/mpls/arista-mpls-augments.yang | 0 .../models/mpls/arista-mpls-deviations.yang | 0 .../models/multicast/arista-pim-augments.yang | 0 .../arista-netinst-deviations.yang | 0 .../arista-vlan-augments.yang | 0 .../arista-vlan-deviations.yang | 0 .../arista-acl-notsupported-deviations.yang | 0 .../arista-bfd-notsupported-deviations.yang | 0 .../arista-bgp-notsupported-deviations.yang | 0 ...ta-interfaces-notsupported-deviations.yang | 0 .../arista-lacp-notsupported-deviations.yang | 0 .../arista-lldp-notsupported-deviations.yang | 0 ...local-routing-notsupported-deviations.yang | 0 ...ista-messages-notsupported-deviations.yang | 0 ...work-instance-notsupported-deviations.yang | 0 ...ista-platform-notsupported-deviations.yang | 0 .../arista-qos-notsupported-deviations.yang | 0 ...outing-policy-notsupported-deviations.yang | 0 ...arista-system-notsupported-deviations.yang | 0 .../openflow/arista-openflow-deviations.yang | 0 .../arista-srte-augments.yang | 0 .../arista-srte-deviations.yang | 0 .../models/policy/arista-rpol-augments.yang | 0 .../models/policy/arista-rpol-deviations.yang | 0 .../models/qos/arista-qos-augments.yang | 0 .../arista-relay-agent-deviations.yang | 0 .../models/system/arista-system-augments.yang | 0 .../system/arista-system-deviations.yang | 0 csbi/testdata/models/third_party/README.md | 0 .../models/third_party/ietf/iana-if-type.yang | 0 .../third_party/ietf/ietf-inet-types.yang | 0 .../third_party/ietf/ietf-interfaces.yang | 0 .../third_party/ietf/ietf-yang-types.yang | 0 csbi/write.go | 0 csbi/write_test.go | 0 dev_env_data/clab/basic_one_arista.yaml | 0 dev_env_data/clab/basic_two_aristas.yaml | 0 dev_env_data/clab/basic_two_gnmi_targets.yaml | 0 dev_env_data/clab/demo.clab.yaml | 0 dev_env_data/clab/gosdn.clab.yaml | 0 dev_env_data/clab/gosdn_slim.clab.yaml | 0 .../docker-compose/basic_docker-compose.yml | 0 .../integration-test_docker-compose.yml | 0 .../plugin-registry/plugin-store.json | 0 dev_env_data/sdn/basic_two_aristas.json | 0 docker-compose.yml | 0 docker_volume_backup/.gitkeep | 0 docs/images/logo.png | Bin docs/images/logo.svg | 0 docs/index.md | 0 documentation/README.md | 0 documentation/SUMMARY.md | 0 documentation/figures/.gitkeep | 0 documentation/figures/nucleus/.gitkeep | 0 ...ted_controller_architecture_nucleus.drawio | 0 ...controller_architecture_nucleus.drawio.png | Bin documentation/figures/overview/.gitkeep | 0 ...ed_controller_architecture_overview.drawio | 0 ...ontroller_architecture_overview.drawio.png | Bin documentation/figures/plugins/.gitkeep | 0 .../plugins/plugin-device-interaction.drawio | 0 .../plugin-device-interaction.drawio.png | Bin forks/LICENSE | 0 forks/README.md | 0 forks/goarista/gnmi/arbitration.go | 0 forks/goarista/gnmi/arbitration_test.go | 0 forks/goarista/gnmi/client.go | 0 forks/goarista/gnmi/json.go | 0 forks/goarista/gnmi/operation.go | 0 forks/goarista/gnmi/operation_test.go | 0 forks/goarista/gnmi/path.go | 0 forks/goarista/gnmi/path_test.go | 0 forks/google/README.md | 0 forks/google/gnmi/model.go | 0 forks/google/gnmi/modeldata/gostruct/gen.go | 0 .../gnmi/modeldata/gostruct/generated.go.wasd | 0 forks/google/gnmi/modeldata/modeldata.go | 0 forks/google/gnmi/server.go | 0 forks/google/gnmi/server_test.go.wasd | 0 forks/google/gnmi/util.go | 0 go.mod | 0 go.sum | 0 gosdn-cli-showcase.webm | Bin .../application_tests/appUtility_test.go | 0 .../application_tests/application_test.go | 0 .../application_tests/eventAssertion_test.go | 0 .../example_tests/example_test.go | 0 .../integrationTestUtils.go | 0 integration-tests/lab_tests/lab00_test.go | 0 .../lab_tests/labUtility_test.go | 0 .../networkElement_tests/modelUtility_test.go | 0 .../networkElement_test.go | 0 integration-tests/rbac_tests/rbac_test.go | 0 .../topology_tests/topology_test.go | 0 lab-vm/README.md | 0 lab-vm/vm-with-packer/gosdn_vm.pkr.hcl | 0 lab-vm/vm-with-packer/http/meta-data | 0 lab-vm/vm-with-packer/http/user-data | 0 lab-vm/vm-with-packer/scripts/gosdn_clone.sh | 0 lab-vm/vm-with-packer/scripts/setup.sh | 0 lab-vm/vm-with-vagrant/Vagrantfile | 0 makefiles/build/Makefile | 0 makefiles/ci/Makefile | 0 makefiles/clab/Makefile | 0 makefiles/container/Makefile | 0 makefiles/generate/Makefile | 0 mkdocs.yml | 0 models/generated/README.md | 0 models/generated/arista/additions.patch | 0 models/generated/arista/arista.go | 0 models/generated/arista/config.yaml | 0 models/generated/arista/yang.go | 0 models/generated/openconfig/additions.patch | 0 models/generated/openconfig/config.yaml | 0 models/generated/openconfig/openconfig.go | 0 models/generated/openconfig/yang.go | 0 plugin-registry/README.md | 0 plugin-registry/main.go | 0 plugin-registry/plugin-registry.Dockerfile | 0 .../plugin-registry.Dockerfile.dockerignore | 0 .../plugin-registry.debug.Dockerfile | 0 ...gin-registry.debug.Dockerfile.dockerignore | 0 plugin-registry/registry.go | 0 plugin-registry/server.go | 0 plugin-registry/store.go | 0 plugins/README.md | 0 plugins/examples/arista/cmd/main.go | 0 plugins/examples/arista/plugin.yaml | 0 plugins/examples/openconfig/cmd/main.go | 0 plugins/examples/openconfig/plugin.yaml | 0 plugins/sdk/deviceModel.go | 0 .../devices/reducer/device.reducer.ts | 8 +- .../devices/view/device.view.table.tsx | 110 +++++++++++------- .../devices/view/device.view.tabs.tsx | 63 ---------- .../components/devices/view/device.view.tsx | 37 +++--- .../subcomponent/device.view.list-detail.tsx | 72 ++++++++++++ .../view_model/device.table.viewmodel.ts | 17 ++- .../view_model/device.tabs.viewmodel.ts | 32 ----- .../devices/view_model/device.viewmodel.ts | 32 ++--- react-ui/src/index.tsx | 1 - .../json_viewer/view/json_viewer.scss | 8 +- .../json_viewer/view/json_viewer.view.tsx | 38 +++--- .../viewmodel/json_viewer.viewmodel.tsx | 21 ++-- react-ui/src/shared/icons/icons.ts | 4 - .../layouts/grid.layout/grid.layout.tsx | 2 +- react-ui/src/shared/style/box.scss | 65 ++++++++--- react-ui/src/shared/style/colors.scss | 3 +- renovate.json | 0 1067 files changed, 271 insertions(+), 245 deletions(-) mode change 100644 => 100755 .cobra.yaml mode change 100644 => 100755 .devcontainer/Dockerfile mode change 100644 => 100755 .devcontainer/devcontainer.json mode change 100644 => 100755 .dockerignore mode change 100644 => 100755 .editorconfig mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .gitlab-ci.yml mode change 100644 => 100755 .gitlab/ci/.build-binaries.yml mode change 100644 => 100755 .gitlab/ci/.build-container-images.yml mode change 100644 => 100755 .gitlab/ci/.code-quality-ci.yml mode change 100644 => 100755 .gitlab/ci/.mk-docs-deploy.yml create mode 100755 .gitlab/ci/.react-ui.yml mode change 100644 => 100755 .gitlab/ci/.release-container.yml mode change 100644 => 100755 .gitlab/ci/.renovate.yml mode change 100644 => 100755 .gitlab/ci/.security-and-compliance-ci.yml mode change 100644 => 100755 .gitlab/ci/.test.yml mode change 100644 => 100755 .gitlab/ci/gnmi-cert-integration.Dockerfile mode change 100644 => 100755 .gitlab/ci/gosdn-integration.Dockerfile mode change 100644 => 100755 .gitlab/ci/legacy/.test.yml mode change 100644 => 100755 .gitlab/issue_templates/Change Request.md mode change 100644 => 100755 .gitlab/issue_templates/Feature Proposal.md mode change 100644 => 100755 .gitlab/issue_templates/Issue Template.md mode change 100644 => 100755 .gitlab/merge_request_templates/Default.md mode change 100644 => 100755 .gitmodules mode change 100644 => 100755 .golangci.yml mode change 100644 => 100755 LICENSE mode change 100644 => 100755 Makefile mode change 100644 => 100755 README.md mode change 100644 => 100755 api/LICENSE mode change 100644 => 100755 api/Makefile mode change 100644 => 100755 api/README.md mode change 100644 => 100755 api/buf.gen.yaml mode change 100644 => 100755 api/buf.work.yaml mode change 100644 => 100755 api/cmd/gogen.go mode change 100644 => 100755 api/deps/buf.yaml mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/.github/workflows/ci-cpp-build-gnmi.yml mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/BUILD.bazel mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/CONTRIBUTING.md mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/LICENSE mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/README.md mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/WORKSPACE.bazel mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cache/cache.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cache/cache_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cli/cli.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cli/cli_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/cache.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/cache_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/client.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/client_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/fake/fake.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/fake/fake_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/flags/flags_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/flags/intmap.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/flags/stringlist.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/flags/stringmap.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/gnmi/client.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/gnmi/client_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/gnmi/credentials.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/notification.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/query.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/reconnect.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/reconnect_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/register.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/client/values.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/Dockerfile mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/README.md mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/cert.pem mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/example.cfg mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/key.pem mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/supervisord.conf mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.cfg mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.crt mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.key mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.cfg mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.crt mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.key mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/unparseable.cfg mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/coalesce/coalesce.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/coalesce/coalesce_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/collector/collector.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/collector/collector_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/connection/connection.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/connection/connection_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/ctree/tree.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/ctree/tree_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/errdiff/errdiff.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/errdiff/errdiff_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/errlist/errlist.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/errlist/errlist_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/gnmi_deps.bzl mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/go.mod mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/go.sum mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/latency/latency.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/latency/latency_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/manager/manager.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/manager/manager_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/manager/meta.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/manager/meta_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/match/match.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/match/match_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/metadata/metadata.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/metadata/metadata_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/metadata/yang/gnmi-collector-metadata.yang mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/path/path.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/path/path_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/collector/BUILD.bazel mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/collector/collector.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/collector/collector.proto mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2_grpc.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi/BUILD.bazel mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.proto mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2_grpc.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/BUILD.bazel mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/target/BUILD.bazel mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/target/target.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/target/target.proto mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/target/target_pb2.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/proto/target/target_pb2_grpc.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/subscribe/subscribe.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/subscribe/subscribe_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/target/target.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/target/target_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/agent.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/client.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/README.md mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/config.pb.txt mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/server.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/gen_fake_config/gen_config.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/gnmi_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.proto mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2_grpc.py mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/queue/fixed_queue.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/config_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/server_option.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/value/value.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/value/value_test.go mode change 100644 => 100755 api/deps/github.com/openconfig/gnmi/watch/watch.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/proto/target/target.pb.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go mode change 100644 => 100755 api/go/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/app/app.pb.go mode change 100644 => 100755 api/go/gosdn/app/app.pb.gw.go mode change 100644 => 100755 api/go/gosdn/app/app_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/configurationmanagement/configurationmanagement.pb.go mode change 100644 => 100755 api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go mode change 100644 => 100755 api/go/gosdn/configurationmanagement/configurationmanagement_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/conflict/conflict.pb.go mode change 100644 => 100755 api/go/gosdn/csbi/csbi.pb.go mode change 100644 => 100755 api/go/gosdn/csbi/csbi_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/networkelement/networkelement.pb.go mode change 100644 => 100755 api/go/gosdn/networkelement/networkelement.pb.gw.go mode change 100644 => 100755 api/go/gosdn/networkelement/networkelement_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/plugin-internal/plugin-internal.pb.go mode change 100644 => 100755 api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/plugin-registry/plugin-registry.pb.go mode change 100644 => 100755 api/go/gosdn/plugin-registry/plugin-registry_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/plugin/plugin.pb.go mode change 100644 => 100755 api/go/gosdn/plugin/plugin_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/pnd/pnd.pb.go mode change 100644 => 100755 api/go/gosdn/pnd/pnd.pb.gw.go mode change 100644 => 100755 api/go/gosdn/pnd/pnd_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/rbac/rbac.pb.go mode change 100644 => 100755 api/go/gosdn/rbac/rbac.pb.gw.go mode change 100644 => 100755 api/go/gosdn/rbac/rbac_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/rbac/role.pb.go mode change 100644 => 100755 api/go/gosdn/rbac/role.pb.gw.go mode change 100644 => 100755 api/go/gosdn/rbac/role_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/rbac/user.pb.go mode change 100644 => 100755 api/go/gosdn/rbac/user.pb.gw.go mode change 100644 => 100755 api/go/gosdn/rbac/user_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/southbound/southbound.pb.go mode change 100644 => 100755 api/go/gosdn/southbound/southbound_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go mode change 100644 => 100755 api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go mode change 100644 => 100755 api/go/gosdn/subscriptionmanagement/subscriptionmanagement_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/topology/link.pb.go mode change 100644 => 100755 api/go/gosdn/topology/node.pb.go mode change 100644 => 100755 api/go/gosdn/topology/port.pb.go mode change 100644 => 100755 api/go/gosdn/topology/route.pb.go mode change 100644 => 100755 api/go/gosdn/topology/routingTable.pb.go mode change 100644 => 100755 api/go/gosdn/topology/routingTable.pb.gw.go mode change 100644 => 100755 api/go/gosdn/topology/routingTable_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/topology/topology.pb.go mode change 100644 => 100755 api/go/gosdn/topology/topology.pb.gw.go mode change 100644 => 100755 api/go/gosdn/topology/topology_grpc.pb.go mode change 100644 => 100755 api/go/gosdn/transport/transport.pb.go mode change 100644 => 100755 api/openapiv2/gosdn_northbound.swagger.json mode change 100644 => 100755 api/proto/buf.lock mode change 100644 => 100755 api/proto/buf.yaml mode change 100644 => 100755 api/proto/gosdn/app/app.proto mode change 100644 => 100755 api/proto/gosdn/configurationmanagement/configurationmanagement.proto mode change 100644 => 100755 api/proto/gosdn/conflict/conflict.proto mode change 100644 => 100755 api/proto/gosdn/csbi/csbi.proto mode change 100644 => 100755 api/proto/gosdn/networkelement/networkelement.proto mode change 100644 => 100755 api/proto/gosdn/plugin-internal/plugin-internal.proto mode change 100644 => 100755 api/proto/gosdn/plugin-registry/plugin-registry.proto mode change 100644 => 100755 api/proto/gosdn/plugin/plugin.proto mode change 100644 => 100755 api/proto/gosdn/pnd/pnd.proto mode change 100644 => 100755 api/proto/gosdn/rbac/rbac.proto mode change 100644 => 100755 api/proto/gosdn/rbac/role.proto mode change 100644 => 100755 api/proto/gosdn/rbac/user.proto mode change 100644 => 100755 api/proto/gosdn/southbound/southbound.proto mode change 100644 => 100755 api/proto/gosdn/subscriptionmanagement/subscriptionmanagement.proto mode change 100644 => 100755 api/proto/gosdn/topology/link.proto mode change 100644 => 100755 api/proto/gosdn/topology/node.proto mode change 100644 => 100755 api/proto/gosdn/topology/port.proto mode change 100644 => 100755 api/proto/gosdn/topology/route.proto mode change 100644 => 100755 api/proto/gosdn/topology/routingTable.proto mode change 100644 => 100755 api/proto/gosdn/topology/topology.proto mode change 100644 => 100755 api/proto/gosdn/transport/transport.proto mode change 100644 => 100755 api/third_party/validator/validator.proto mode change 100644 => 100755 application-framework/event/event.go mode change 100644 => 100755 application-framework/event/eventService.go mode change 100644 => 100755 application-framework/event/event_test.go mode change 100644 => 100755 application-framework/event/topics.go mode change 100644 => 100755 application-framework/event/type.go mode change 100644 => 100755 application-framework/models/model-handling.go mode change 100644 => 100755 application-framework/models/model-handling_test.go mode change 100644 => 100755 application-framework/registration/registration.go mode change 100644 => 100755 applications/arista-routing-engine/app.go mode change 100644 => 100755 applications/arista-routing-engine/arista-routing-engine.Dockerfile mode change 100644 => 100755 applications/arista-routing-engine/arista-routing-engine.Dockerfile.dockerignore mode change 100644 => 100755 applications/arista-routing-engine/main.go mode change 100644 => 100755 applications/arista-routing-engine/network-element.go mode change 100644 => 100755 applications/arista-routing-engine/routing.go mode change 100644 => 100755 applications/basic-interface-monitoring/app.go mode change 100644 => 100755 applications/basic-interface-monitoring/http.go mode change 100644 => 100755 applications/basic-interface-monitoring/main.go mode change 100644 => 100755 applications/basic-interface-monitoring/network-element.go mode change 100644 => 100755 applications/basic-interface-monitoring/webpage/index.html mode change 100644 => 100755 applications/hostname-checker/app.go mode change 100644 => 100755 applications/hostname-checker/device.go mode change 100644 => 100755 applications/hostname-checker/main.go mode change 100644 => 100755 applications/inventory-manager/README.md mode change 100644 => 100755 applications/inventory-manager/config/config.go mode change 100644 => 100755 applications/inventory-manager/example.yml mode change 100644 => 100755 applications/inventory-manager/inventory-manager.Dockerfile mode change 100644 => 100755 applications/inventory-manager/inventory-manager.Dockerfile.dockerignore mode change 100644 => 100755 applications/inventory-manager/inventoryManager/inventoryManager.go mode change 100644 => 100755 applications/inventory-manager/inventoryManager/util.go mode change 100644 => 100755 applications/inventory-manager/main.go mode change 100644 => 100755 applications/venv-manager/Readme.md mode change 100644 => 100755 applications/venv-manager/containerlab/containerlab.go mode change 100644 => 100755 applications/venv-manager/links/link.go mode change 100644 => 100755 applications/venv-manager/main.go mode change 100644 => 100755 applications/venv-manager/node/node.go mode change 100644 => 100755 applications/venv-manager/port/port.go mode change 100644 => 100755 applications/venv-manager/topology/topology.go mode change 100644 => 100755 applications/venv-manager/venv-manager.Dockerfile mode change 100644 => 100755 applications/venv-manager/venv-manager.Dockerfile.dockerignore mode change 100644 => 100755 applications/venv-manager/venv-manager/venv-manager.go mode change 100644 => 100755 applications/venv-manager/yang-parser/yang-parser.go mode change 100644 => 100755 applications/ws-events/app.go mode change 100644 => 100755 applications/ws-events/main.go mode change 100644 => 100755 applications/ws-events/ws-events.Dockerfile mode change 100644 => 100755 applications/ws-events/ws-events.Dockerfile.dockerignore mode change 100644 => 100755 applications/ws-events/ws.go mode change 100644 => 100755 cli/LICENSE mode change 100644 => 100755 cli/README.md mode change 100644 => 100755 cli/adapter/PndAdapter.go mode change 100644 => 100755 cli/adapter/PndAdapter_test.go mode change 100644 => 100755 cli/build/ci/.security-and-compliance-ci.yml mode change 100644 => 100755 cli/build/ci/.test.yml mode change 100644 => 100755 cli/cli.Dockerfile mode change 100644 => 100755 cli/cli.Dockerfile.dockerignore mode change 100644 => 100755 cli/cmd/change.go mode change 100644 => 100755 cli/cmd/changeCommit.go mode change 100644 => 100755 cli/cmd/changeConfirm.go mode change 100644 => 100755 cli/cmd/changeGet.go mode change 100644 => 100755 cli/cmd/changeList.go mode change 100644 => 100755 cli/cmd/config/.gosdnc.toml mode change 100644 => 100755 cli/cmd/list.go mode change 100644 => 100755 cli/cmd/login.go mode change 100644 => 100755 cli/cmd/logout.go mode change 100644 => 100755 cli/cmd/networkElement.go mode change 100644 => 100755 cli/cmd/networkElementCreate.go mode change 100644 => 100755 cli/cmd/networkElementList.go mode change 100644 => 100755 cli/cmd/networkElementPath.go mode change 100644 => 100755 cli/cmd/networkElementPathDelete.go mode change 100644 => 100755 cli/cmd/networkElementPathGet.go mode change 100644 => 100755 cli/cmd/networkElementPathGetIntended.go mode change 100644 => 100755 cli/cmd/networkElementPathSet.go mode change 100644 => 100755 cli/cmd/networkElementRemove.go mode change 100644 => 100755 cli/cmd/networkElementShow.go mode change 100644 => 100755 cli/cmd/networkElementSubscribe.go mode change 100644 => 100755 cli/cmd/plugin.go mode change 100644 => 100755 cli/cmd/pluginList.go mode change 100644 => 100755 cli/cmd/pnd.go mode change 100644 => 100755 cli/cmd/pndCreate.go mode change 100644 => 100755 cli/cmd/pndGet.go mode change 100644 => 100755 cli/cmd/pndList.go mode change 100644 => 100755 cli/cmd/pndRemove.go mode change 100644 => 100755 cli/cmd/pndUse.go mode change 100644 => 100755 cli/cmd/prompt.go mode change 100644 => 100755 cli/cmd/role.go mode change 100644 => 100755 cli/cmd/roleCreate.go mode change 100644 => 100755 cli/cmd/roleGetAll.go mode change 100644 => 100755 cli/cmd/root.go mode change 100644 => 100755 cli/cmd/subManagement.go mode change 100644 => 100755 cli/cmd/subManagementGetAll.go mode change 100644 => 100755 cli/cmd/subManagementResetAll.go mode change 100644 => 100755 cli/cmd/user.go mode change 100644 => 100755 cli/cmd/userCreate.go mode change 100644 => 100755 cli/cmd/userDelete.go mode change 100644 => 100755 cli/cmd/userGet.go mode change 100644 => 100755 cli/cmd/userGetAll.go mode change 100644 => 100755 cli/cmd/userUpdate.go mode change 100644 => 100755 cli/cmd/utils.go mode change 100644 => 100755 cli/cmd/utils_test.go mode change 100644 => 100755 cli/completer/utils.go mode change 100644 => 100755 cli/completer/yangSchemaCompleter.go mode change 100644 => 100755 cli/config/.cobra.yaml mode change 100644 => 100755 cli/config/gosdnc.toml.example mode change 100644 => 100755 cli/main.go mode change 100644 => 100755 cli/test/containerlab/integrationtest.clab.tmpl.yml mode change 100644 => 100755 cli/test/containerlab/integrationtest_branch.clab.tmpl.yml mode change 100644 => 100755 config.js mode change 100644 => 100755 controller/ARCHITECTURE.md mode change 100644 => 100755 controller/CONTRIBUTING.md mode change 100644 => 100755 controller/Dockerfile.debug mode change 100644 => 100755 controller/Makefile mode change 100644 => 100755 controller/README.md mode change 100644 => 100755 controller/api/apiUtil_test.go mode change 100644 => 100755 controller/api/api_test.go mode change 100644 => 100755 controller/api/api_test.toml mode change 100644 => 100755 controller/api/app.go mode change 100644 => 100755 controller/api/auth.go mode change 100644 => 100755 controller/api/auth_test.go mode change 100644 => 100755 controller/api/change.go mode change 100644 => 100755 controller/api/configurationManagement.go mode change 100644 => 100755 controller/api/grpc.go mode change 100644 => 100755 controller/api/initialise_test.go mode change 100644 => 100755 controller/api/managedNetworkElement.go mode change 100644 => 100755 controller/api/plugin.go mode change 100644 => 100755 controller/api/pnd.go mode change 100644 => 100755 controller/api/role.go mode change 100644 => 100755 controller/api/role_test.go mode change 100644 => 100755 controller/api/subManagement.go mode change 100644 => 100755 controller/api/user.go mode change 100644 => 100755 controller/api/user_test.go mode change 100644 => 100755 controller/app/DatabaseStore.go mode change 100644 => 100755 controller/app/Service.go mode change 100644 => 100755 controller/app/app.go mode change 100644 => 100755 controller/app/store.go mode change 100644 => 100755 controller/app/utils.go mode change 100644 => 100755 controller/cmd/gosdn/main.go mode change 100644 => 100755 controller/cmd/root.go mode change 100644 => 100755 controller/cmd/version.go mode change 100644 => 100755 controller/config/config.go mode change 100644 => 100755 controller/config/config_test.go mode change 100644 => 100755 controller/config/environment.go mode change 100644 => 100755 controller/config/gnmiSubscriptionConfig.go mode change 100644 => 100755 controller/configs/.gitkeep mode change 100644 => 100755 controller/configs/basic-docker-compose.toml mode change 100644 => 100755 controller/configs/containerlab-gosdn.toml.example mode change 100644 => 100755 controller/configs/development-gosdn.toml.example mode change 100644 => 100755 controller/configs/gNMISubscriptions.txt.example mode change 100644 => 100755 controller/configs/integration-test-gosdn.toml mode change 100644 => 100755 controller/conflict/versioning.go mode change 100644 => 100755 controller/controller.Dockerfile mode change 100644 => 100755 controller/controller.Dockerfile.dockerignore mode change 100644 => 100755 controller/controller.go mode change 100644 => 100755 controller/controller_test.go mode change 100644 => 100755 controller/customerrs/errors.go mode change 100644 => 100755 controller/event/event.go mode change 100644 => 100755 controller/event/event_test.go mode change 100644 => 100755 controller/eventService/Service.go mode change 100644 => 100755 controller/eventService/utils.go mode change 100644 => 100755 controller/http.go mode change 100644 => 100755 controller/http_test.go mode change 100644 => 100755 controller/initialise_test.go mode change 100644 => 100755 controller/interfaces/change/change.go mode change 100644 => 100755 controller/interfaces/event/service.go mode change 100644 => 100755 controller/interfaces/networkdomain/pnd.go mode change 100644 => 100755 controller/interfaces/networkdomain/pndService.go mode change 100644 => 100755 controller/interfaces/networkdomain/pndStore.go mode change 100644 => 100755 controller/interfaces/networkelement/networkElement.go mode change 100644 => 100755 controller/interfaces/networkelement/networkElementService.go mode change 100644 => 100755 controller/interfaces/networkelement/networkElementStore.go mode change 100644 => 100755 controller/interfaces/plugin/plugin.go mode change 100644 => 100755 controller/interfaces/plugin/pluginService.go mode change 100644 => 100755 controller/interfaces/plugin/pluginStore.go mode change 100644 => 100755 controller/interfaces/rbac/rbacService.go mode change 100644 => 100755 controller/interfaces/rbac/role.go mode change 100644 => 100755 controller/interfaces/rbac/roleStore.go mode change 100644 => 100755 controller/interfaces/rbac/user.go mode change 100644 => 100755 controller/interfaces/rbac/userStore.go mode change 100644 => 100755 controller/interfaces/store/store.go mode change 100644 => 100755 controller/interfaces/transport/transport.go mode change 100644 => 100755 controller/metrics/prometheus.go mode change 100644 => 100755 controller/mocks/Change.go mode change 100644 => 100755 controller/mocks/Csbi.go mode change 100644 => 100755 controller/mocks/Device.go mode change 100644 => 100755 controller/mocks/GNMIClient.go mode change 100644 => 100755 controller/mocks/GNMIServer.go mode change 100644 => 100755 controller/mocks/GNMI_SubscribeClient.go mode change 100644 => 100755 controller/mocks/GNMI_SubscribeServer.go mode change 100644 => 100755 controller/mocks/GenericGoStructClient.go mode change 100644 => 100755 controller/mocks/HandleSubscribeResponse.go mode change 100644 => 100755 controller/mocks/NetworkDomain.go mode change 100644 => 100755 controller/mocks/NetworkElement.go mode change 100644 => 100755 controller/mocks/Plugin.go mode change 100644 => 100755 controller/mocks/PluginRegistryServiceClient.go mode change 100644 => 100755 controller/mocks/Plugin_additions.go mode change 100644 => 100755 controller/mocks/PndService.go mode change 100644 => 100755 controller/mocks/PndStore.go mode change 100644 => 100755 controller/mocks/Pnd_Additions.go mode change 100644 => 100755 controller/mocks/Role.go mode change 100644 => 100755 controller/mocks/RoleService.go mode change 100644 => 100755 controller/mocks/RoleStore.go mode change 100644 => 100755 controller/mocks/Service.go mode change 100644 => 100755 controller/mocks/Storable.go mode change 100644 => 100755 controller/mocks/Store.go mode change 100644 => 100755 controller/mocks/Transport.go mode change 100644 => 100755 controller/mocks/UnsafeGNMIServer.go mode change 100644 => 100755 controller/mocks/User.go mode change 100644 => 100755 controller/mocks/UserService.go mode change 100644 => 100755 controller/mocks/UserStore.go mode change 100644 => 100755 controller/mocks/isSubscribeRequest_Request.go mode change 100644 => 100755 controller/mocks/isSubscribeResponse_Response.go mode change 100644 => 100755 controller/mocks/isTypedValue_Value.go mode change 100644 => 100755 controller/northbound/client/app.go mode change 100644 => 100755 controller/northbound/client/configurationManagement.go mode change 100644 => 100755 controller/northbound/client/networkElement.go mode change 100644 => 100755 controller/northbound/client/plugin.go mode change 100644 => 100755 controller/northbound/client/pnd.go mode change 100644 => 100755 controller/northbound/client/rbac.go mode change 100644 => 100755 controller/northbound/client/sbi.go mode change 100644 => 100755 controller/northbound/client/submanagement.go mode change 100644 => 100755 controller/northbound/server/app.go mode change 100644 => 100755 controller/northbound/server/auth.go mode change 100644 => 100755 controller/northbound/server/auth_interceptor.go mode change 100644 => 100755 controller/northbound/server/auth_interceptor_test.go mode change 100644 => 100755 controller/northbound/server/auth_test.go mode change 100644 => 100755 controller/northbound/server/configurationmanagement.go mode change 100644 => 100755 controller/northbound/server/csbi.go mode change 100644 => 100755 controller/northbound/server/metrics.go mode change 100644 => 100755 controller/northbound/server/nbi.go mode change 100644 => 100755 controller/northbound/server/networkElement.go mode change 100644 => 100755 controller/northbound/server/networkElement_test.go mode change 100644 => 100755 controller/northbound/server/plugin.go mode change 100644 => 100755 controller/northbound/server/pnd.go mode change 100644 => 100755 controller/northbound/server/pnd_test.go mode change 100644 => 100755 controller/northbound/server/role.go mode change 100644 => 100755 controller/northbound/server/role_test.go mode change 100644 => 100755 controller/northbound/server/route.go mode change 100644 => 100755 controller/northbound/server/submanagement.go mode change 100644 => 100755 controller/northbound/server/test_util_test.go mode change 100644 => 100755 controller/northbound/server/topology.go mode change 100644 => 100755 controller/northbound/server/topology_test.go mode change 100644 => 100755 controller/northbound/server/user.go mode change 100644 => 100755 controller/northbound/server/user_test.go mode change 100644 => 100755 controller/northbound/server/utils_test.go mode change 100644 => 100755 controller/nucleus/change.go mode change 100644 => 100755 controller/nucleus/change_test.go mode change 100644 => 100755 controller/nucleus/clientConfig.go mode change 100644 => 100755 controller/nucleus/database/mongo-connection.go mode change 100644 => 100755 controller/nucleus/databaseNetworkElementStore.go mode change 100644 => 100755 controller/nucleus/databasePluginStore.go mode change 100644 => 100755 controller/nucleus/databasePndStore.go mode change 100644 => 100755 controller/nucleus/genericService.go mode change 100644 => 100755 controller/nucleus/gnmi_transport.go mode change 100644 => 100755 controller/nucleus/gnmi_transport_test.go mode change 100644 => 100755 controller/nucleus/initialise_test.go mode change 100644 => 100755 controller/nucleus/memoryNetworkElementStore.go mode change 100644 => 100755 controller/nucleus/memoryPluginStore.go mode change 100644 => 100755 controller/nucleus/memoryPndStore.go mode change 100644 => 100755 controller/nucleus/networkElement.go mode change 100644 => 100755 controller/nucleus/networkElementFilesystemStore.go mode change 100644 => 100755 controller/nucleus/networkElementFilesystemStore_test.go mode change 100644 => 100755 controller/nucleus/networkElementService.go mode change 100644 => 100755 controller/nucleus/networkElementServiceMock.go mode change 100644 => 100755 controller/nucleus/networkElementService_test.go mode change 100644 => 100755 controller/nucleus/networkElementStore.go mode change 100644 => 100755 controller/nucleus/networkElementWatcher.go mode change 100644 => 100755 controller/nucleus/networkElement_test.go mode change 100644 => 100755 controller/nucleus/plugin.go mode change 100644 => 100755 controller/nucleus/pluginFilesystemStore.go mode change 100644 => 100755 controller/nucleus/pluginFilesystemStore_test.go mode change 100644 => 100755 controller/nucleus/pluginService.go mode change 100644 => 100755 controller/nucleus/pluginServiceMock.go mode change 100644 => 100755 controller/nucleus/pluginStore.go mode change 100644 => 100755 controller/nucleus/plugin_test.go mode change 100644 => 100755 controller/nucleus/pndFilesystemStore.go mode change 100644 => 100755 controller/nucleus/pndFilesystemStore_test.go mode change 100644 => 100755 controller/nucleus/pndService.go mode change 100644 => 100755 controller/nucleus/pndStore.go mode change 100644 => 100755 controller/nucleus/principalNetworkDomain.go mode change 100644 => 100755 controller/nucleus/principalNetworkDomain_test.go mode change 100644 => 100755 controller/nucleus/restconf_transport.go mode change 100644 => 100755 controller/nucleus/restconf_transport_test.go mode change 100644 => 100755 controller/nucleus/subscriptionQueueHandler.go mode change 100644 => 100755 controller/nucleus/transport.go mode change 100644 => 100755 controller/nucleus/transport_test.go mode change 100644 => 100755 controller/nucleus/types/types.go mode change 100644 => 100755 controller/nucleus/util/gnmi/convert.go mode change 100644 => 100755 controller/nucleus/util/gnmi/notification.go mode change 100644 => 100755 controller/nucleus/util/path/translate.go mode change 100644 => 100755 controller/nucleus/util/path/traverse.go mode change 100644 => 100755 controller/nucleus/util/path/traverse_test.go mode change 100644 => 100755 controller/nucleus/util/plugin.go mode change 100644 => 100755 controller/nucleus/util/proto/message.go mode change 100644 => 100755 controller/nucleus/util/proto/message_test.go mode change 100644 => 100755 controller/plugin/shared/client.go mode change 100644 => 100755 controller/plugin/shared/interface.go mode change 100644 => 100755 controller/plugin/shared/server.go mode change 100644 => 100755 controller/plugin/shared/util.go mode change 100644 => 100755 controller/rbac/databaseRoleStore.go mode change 100644 => 100755 controller/rbac/databaseUserStore.go mode change 100644 => 100755 controller/rbac/jwtManager.go mode change 100644 => 100755 controller/rbac/jwtManager_test.go mode change 100644 => 100755 controller/rbac/memoryRoleStore.go mode change 100644 => 100755 controller/rbac/memoryUserStore.go mode change 100644 => 100755 controller/rbac/rbacService.go mode change 100644 => 100755 controller/rbac/rbacTestUtil_test.go mode change 100644 => 100755 controller/rbac/role.go mode change 100644 => 100755 controller/rbac/roleFileSystemStore.go mode change 100644 => 100755 controller/rbac/roleFileSystemStore_test.go mode change 100644 => 100755 controller/rbac/roleStore.go mode change 100644 => 100755 controller/rbac/user.go mode change 100644 => 100755 controller/rbac/userFileSystemStore.go mode change 100644 => 100755 controller/rbac/userFileSystemStore_test.go mode change 100644 => 100755 controller/rbac/userStore.go mode change 100644 => 100755 controller/store/changeStores.go mode change 100644 => 100755 controller/store/filesystem-settings.go mode change 100644 => 100755 controller/store/genericStore.go mode change 100644 => 100755 controller/store/initialise_test.go mode change 100644 => 100755 controller/store/oldGenericStore.go mode change 100644 => 100755 controller/store/query.go mode change 100644 => 100755 controller/store/storageMode.go mode change 100644 => 100755 controller/store/utils.go mode change 100644 => 100755 controller/test/arista-interface-response.json mode change 100644 => 100755 controller/test/arista-interface-response2.json mode change 100644 => 100755 controller/test/arista-root-response.json mode change 100644 => 100755 controller/test/containerlab/complex-1.0.clab.tmpl.yml mode change 100644 => 100755 controller/test/containerlab/complex-1.0.png mode change 100644 => 100755 controller/test/containerlab/dev.clab.tmpl.yml mode change 100644 => 100755 controller/test/containerlab/int01.clab.tmpl.yml mode change 100644 => 100755 controller/test/plugin/csbiAdditions.go mode change 100644 => 100755 controller/test/plugin/faulty/csbiAdditions.go mode change 100644 => 100755 controller/test/plugin/faulty/gostructs.go mode change 100644 => 100755 controller/test/plugin/faulty/plugin.yml mode change 100644 => 100755 controller/test/plugin/gostructs.go mode change 100644 => 100755 controller/test/plugin/plugin.yml mode change 100644 => 100755 controller/test/proto/cap-resp-arista-ceos mode change 100644 => 100755 controller/test/proto/req-full-node mode change 100644 => 100755 controller/test/proto/req-full-node-arista-ceos mode change 100644 => 100755 controller/test/proto/req-interfaces-arista-ceos mode change 100644 => 100755 controller/test/proto/req-interfaces-interface-arista-ceos mode change 100644 => 100755 controller/test/proto/req-interfaces-wildcard mode change 100644 => 100755 controller/test/proto/resp-full-node mode change 100644 => 100755 controller/test/proto/resp-full-node-arista-ceos mode change 100644 => 100755 controller/test/proto/resp-interfaces-arista-ceos mode change 100644 => 100755 controller/test/proto/resp-interfaces-interface-arista-ceos mode change 100644 => 100755 controller/test/proto/resp-interfaces-wildcard mode change 100644 => 100755 controller/test/proto/resp-set-system-config-hostname mode change 100644 => 100755 controller/test/targets.go mode change 100644 => 100755 controller/test/terraform/.docker/ca.pem mode change 100644 => 100755 controller/test/terraform/.docker/cert.pem mode change 100644 => 100755 controller/test/terraform/.docker/server-cert.pem mode change 100644 => 100755 controller/test/terraform/containers.tf mode change 100644 => 100755 controller/test/terraform/images.tf mode change 100644 => 100755 controller/test/terraform/main.tf mode change 100644 => 100755 controller/test/terraform/providers.tf mode change 100644 => 100755 controller/test/terraform/resources.tf mode change 100644 => 100755 controller/test/terraform/variables.tf mode change 100644 => 100755 controller/test/yang/test-module.go mode change 100644 => 100755 controller/test/yang/test.yang mode change 100644 => 100755 controller/test/yang/yang.go mode change 100644 => 100755 controller/topology/links/link.go mode change 100644 => 100755 controller/topology/nodes/databaseNodeStore.go mode change 100644 => 100755 controller/topology/nodes/node.go mode change 100644 => 100755 controller/topology/nodes/nodeService.go mode change 100644 => 100755 controller/topology/nodes/nodeService_test.go mode change 100644 => 100755 controller/topology/nodes/store.go mode change 100644 => 100755 controller/topology/ports/configuration/configuration.go mode change 100644 => 100755 controller/topology/ports/port.go mode change 100644 => 100755 controller/topology/ports/portService.go mode change 100644 => 100755 controller/topology/ports/portService_test.go mode change 100644 => 100755 controller/topology/ports/portStore.go mode change 100644 => 100755 controller/topology/ports/store.go mode change 100644 => 100755 controller/topology/routing-tables/route.go mode change 100644 => 100755 controller/topology/routing-tables/routingTable.go mode change 100644 => 100755 controller/topology/routing-tables/routingTableService.go mode change 100644 => 100755 controller/topology/routing-tables/routingTableService_test.go mode change 100644 => 100755 controller/topology/routing-tables/routingTableStore.go mode change 100644 => 100755 controller/topology/routing-tables/store.go mode change 100644 => 100755 controller/topology/store.go mode change 100644 => 100755 controller/topology/store/genericStore.go mode change 100644 => 100755 controller/topology/store/genericStore_test.go mode change 100644 => 100755 controller/topology/store/query.go mode change 100644 => 100755 controller/topology/topology.go mode change 100644 => 100755 controller/topology/topologyService.go mode change 100644 => 100755 controller/topology/topologyService_test.go mode change 100644 => 100755 controller/topology/topologyStore.go mode change 100644 => 100755 controller/version/version.go mode change 100644 => 100755 controller/version/version_test.go mode change 100644 => 100755 csbi/.csbi.yaml mode change 100644 => 100755 csbi/Dockerfile.exec mode change 100644 => 100755 csbi/LICENSE mode change 100644 => 100755 csbi/README.md mode change 100644 => 100755 csbi/arista.capabilities mode change 100644 => 100755 csbi/build.go mode change 100644 => 100755 csbi/build/ci/.build-container.yml mode change 100644 => 100755 csbi/build/ci/.code-quality-ci.yml mode change 100644 => 100755 csbi/build/ci/.golangci-config/.golangci.yml mode change 100644 => 100755 csbi/build/ci/.security-and-compliance-ci.yml mode change 100644 => 100755 csbi/build/ci/.test.yml mode change 100644 => 100755 csbi/build_test.go mode change 100644 => 100755 csbi/cmd/csbi/main.go mode change 100644 => 100755 csbi/cmd/debug/main.go mode change 100644 => 100755 csbi/cmd/demo/main.go mode change 100644 => 100755 csbi/cmd/deploy.go mode change 100644 => 100755 csbi/cmd/discover.go mode change 100644 => 100755 csbi/cmd/executor/executor.go mode change 100644 => 100755 csbi/cmd/executor/experiment.yaml mode change 100644 => 100755 csbi/cmd/generate.go mode change 100644 => 100755 csbi/cmd/hello.go mode change 100644 => 100755 csbi/cmd/init.go mode change 100644 => 100755 csbi/cmd/repository.go mode change 100644 => 100755 csbi/cmd/root.go mode change 100644 => 100755 csbi/config/config.go mode change 100644 => 100755 csbi/csbi.Dockerfile mode change 100644 => 100755 csbi/csbi.Dockerfile.dockerignore mode change 100644 => 100755 csbi/deployment.go mode change 100644 => 100755 csbi/deployment_test.go mode change 100644 => 100755 csbi/discover.go mode change 100644 => 100755 csbi/discover_test.go mode change 100644 => 100755 csbi/docker-compose.yml mode change 100644 => 100755 csbi/generate.go mode change 100644 => 100755 csbi/generate_test.go mode change 100644 => 100755 csbi/gnmi-target/gnmitarget.Dockerfile mode change 100644 => 100755 csbi/gnmi-target/gnmitarget.Dockerfile.dockerignore mode change 100644 => 100755 csbi/grafana/provisioning/datasources/prometheus_ds.yml mode change 100644 => 100755 csbi/grpc.go mode change 100644 => 100755 csbi/grpc_test.go mode change 100644 => 100755 csbi/http.go mode change 100644 => 100755 csbi/http_test.go mode change 100644 => 100755 csbi/metrics.go mode change 100644 => 100755 csbi/model.go mode change 100644 => 100755 csbi/orchestrator.go mode change 100644 => 100755 csbi/orchestrator_test.go mode change 100644 => 100755 csbi/prometheus/alerts.yml mode change 100644 => 100755 csbi/prometheus/prometheus.yml mode change 100644 => 100755 csbi/report.xml mode change 100644 => 100755 csbi/repository.go mode change 100644 => 100755 csbi/repository_test.go mode change 100644 => 100755 csbi/resources/Dockerfile mode change 100644 => 100755 csbi/resources/config.yaml mode change 100644 => 100755 csbi/resources/csbi.go mode change 100644 => 100755 csbi/resources/csbiAdditions.go mode change 100644 => 100755 csbi/resources/go.mod mode change 100644 => 100755 csbi/resources/go.sum mode change 100644 => 100755 csbi/resources/gostructs.go mode change 100644 => 100755 csbi/run.go mode change 100644 => 100755 csbi/run_test.go mode change 100644 => 100755 csbi/templates.go mode change 100644 => 100755 csbi/test.clab.yml mode change 100644 => 100755 csbi/testdata/00000000-0000-0000-0000-000000000000/gostructs.go mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/arista-cli.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/arista-eos-types.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/arista-exp-eos.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/cert/arista-gnoi-cert.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/evpn/arista-exp-eos-evpn.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/igmpsnooping/arista-exp-eos-igmpsnooping.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/l2protocolforwarding/arista-exp-eos-l2protocolforwarding.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/mlag/arista-exp-eos-mlag.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/multicast/arista-exp-eos-multicast.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/openconfig-component-counters.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-acl-config.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-config.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/rpc/arista-rpc-netconf.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-intf.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-net-inst.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/vlan/vlan-translation.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan-config.yang mode change 100644 => 100755 csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/LICENSE mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-interfaces.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-chassis.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-linecard.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-node.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-port.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-qos.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/LICENSE mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/README.md mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/acl/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/acl/openconfig-acl.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-common.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ethernet.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv4.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv6.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-mpls.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-network-instance.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-pf.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bfd/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bfd/openconfig-bfd.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-multiprotocol.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-structure.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-errors.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-global.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-neighbor.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-peer-group.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-policy.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/catalog/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-catalog-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-module-catalog.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/firewall/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-high-availability.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-link-monitoring.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-8021x.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-aggregate.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet-ext.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip-ext.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-poe.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-sdn-ext.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-tunnel.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-interfaces.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/isis/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsdb-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-policy.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-routing.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/lacp/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/lacp/openconfig-lacp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/lldp/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/local-routing/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/local-routing/openconfig-local-routing.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/macsec/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-igp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-ldp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-rsvp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-sr.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-static.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-te.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/multicast/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/network-instance/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l2.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l3.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-policy.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/openconfig-extensions.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/openflow/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-channel-monitor.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-amplifier.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-attenuator.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-terminal-device.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-common.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-connectivity.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-protection.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-wavelength-router.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-policy.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area-interface.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-common.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-global.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-lsdb.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/p4rt/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/p4rt/openconfig-p4rt.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-cpu.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-ext.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-fan.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-linecard.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-pipeline-counters.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-port.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-psu.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-software.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-transceiver.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-forwarding-policies.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-interfaces.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-path-groups.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-srte.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-policy-forwarding.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy/openconfig-policy-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/policy/openconfig-routing-policy.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/probes/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/qos/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-elements.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-interfaces.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/relay-agent/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/relay-agent/openconfig-relay-agent.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-attributes.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-ext.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-shared-attributes.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-table-attributes.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-tables.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/sampling/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/sampling/openconfig-sampling-sflow.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/segment-routing/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-rsvp-sr-ext.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-srte-policy.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/stp/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-radius.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-tacacs.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarm-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarms.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-license.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-messages.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-procmon.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-logging.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-management.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-terminal.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/telemetry/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/types/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/types/openconfig-inet-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/types/openconfig-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/types/openconfig-yang-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/vlan/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan-types.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/.spec.yml mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/README.md mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-access-points.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-interfaces.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-manager.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-mac.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-phy.yang mode change 100644 => 100755 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-types.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/acl/arista-acl-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/aft/arista-aft-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/isis/arista-isis-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/isis/arista-isis-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/local-routing/arista-local-routing-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/multicast/arista-pim-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/network-instance/arista-netinst-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-acl-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-bfd-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-bgp-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-interfaces-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-lacp-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-lldp-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-local-routing-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-messages-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-network-instance-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-platform-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-qos-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-routing-policy-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/not-supported/arista-system-notsupported-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/openflow/arista-openflow-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/policy/arista-rpol-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/policy/arista-rpol-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/qos/arista-qos-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/relay-agent/arista-relay-agent-deviations.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/system/arista-system-augments.yang mode change 100644 => 100755 csbi/testdata/models/release/openconfig/models/system/arista-system-deviations.yang mode change 100644 => 100755 csbi/testdata/models/third_party/README.md mode change 100644 => 100755 csbi/testdata/models/third_party/ietf/iana-if-type.yang mode change 100644 => 100755 csbi/testdata/models/third_party/ietf/ietf-inet-types.yang mode change 100644 => 100755 csbi/testdata/models/third_party/ietf/ietf-interfaces.yang mode change 100644 => 100755 csbi/testdata/models/third_party/ietf/ietf-yang-types.yang mode change 100644 => 100755 csbi/write.go mode change 100644 => 100755 csbi/write_test.go mode change 100644 => 100755 dev_env_data/clab/basic_one_arista.yaml mode change 100644 => 100755 dev_env_data/clab/basic_two_aristas.yaml mode change 100644 => 100755 dev_env_data/clab/basic_two_gnmi_targets.yaml mode change 100644 => 100755 dev_env_data/clab/demo.clab.yaml mode change 100644 => 100755 dev_env_data/clab/gosdn.clab.yaml mode change 100644 => 100755 dev_env_data/clab/gosdn_slim.clab.yaml mode change 100644 => 100755 dev_env_data/docker-compose/basic_docker-compose.yml mode change 100644 => 100755 dev_env_data/docker-compose/integration-test_docker-compose.yml mode change 100644 => 100755 dev_env_data/plugin-registry/plugin-store.json mode change 100644 => 100755 dev_env_data/sdn/basic_two_aristas.json mode change 100644 => 100755 docker-compose.yml mode change 100644 => 100755 docker_volume_backup/.gitkeep mode change 100644 => 100755 docs/images/logo.png mode change 100644 => 100755 docs/images/logo.svg mode change 100644 => 100755 docs/index.md mode change 100644 => 100755 documentation/README.md mode change 100644 => 100755 documentation/SUMMARY.md mode change 100644 => 100755 documentation/figures/.gitkeep mode change 100644 => 100755 documentation/figures/nucleus/.gitkeep mode change 100644 => 100755 documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio mode change 100644 => 100755 documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio.png mode change 100644 => 100755 documentation/figures/overview/.gitkeep mode change 100644 => 100755 documentation/figures/overview/updated_controller_architecture_overview.drawio mode change 100644 => 100755 documentation/figures/overview/updated_controller_architecture_overview.drawio.png mode change 100644 => 100755 documentation/figures/plugins/.gitkeep mode change 100644 => 100755 documentation/figures/plugins/plugin-device-interaction.drawio mode change 100644 => 100755 documentation/figures/plugins/plugin-device-interaction.drawio.png mode change 100644 => 100755 forks/LICENSE mode change 100644 => 100755 forks/README.md mode change 100644 => 100755 forks/goarista/gnmi/arbitration.go mode change 100644 => 100755 forks/goarista/gnmi/arbitration_test.go mode change 100644 => 100755 forks/goarista/gnmi/client.go mode change 100644 => 100755 forks/goarista/gnmi/json.go mode change 100644 => 100755 forks/goarista/gnmi/operation.go mode change 100644 => 100755 forks/goarista/gnmi/operation_test.go mode change 100644 => 100755 forks/goarista/gnmi/path.go mode change 100644 => 100755 forks/goarista/gnmi/path_test.go mode change 100644 => 100755 forks/google/README.md mode change 100644 => 100755 forks/google/gnmi/model.go mode change 100644 => 100755 forks/google/gnmi/modeldata/gostruct/gen.go mode change 100644 => 100755 forks/google/gnmi/modeldata/gostruct/generated.go.wasd mode change 100644 => 100755 forks/google/gnmi/modeldata/modeldata.go mode change 100644 => 100755 forks/google/gnmi/server.go mode change 100644 => 100755 forks/google/gnmi/server_test.go.wasd mode change 100644 => 100755 forks/google/gnmi/util.go mode change 100644 => 100755 go.mod mode change 100644 => 100755 go.sum mode change 100644 => 100755 gosdn-cli-showcase.webm mode change 100644 => 100755 integration-tests/application_tests/appUtility_test.go mode change 100644 => 100755 integration-tests/application_tests/application_test.go mode change 100644 => 100755 integration-tests/application_tests/eventAssertion_test.go mode change 100644 => 100755 integration-tests/example_tests/example_test.go mode change 100644 => 100755 integration-tests/integrationTestUtils/integrationTestUtils.go mode change 100644 => 100755 integration-tests/lab_tests/lab00_test.go mode change 100644 => 100755 integration-tests/lab_tests/labUtility_test.go mode change 100644 => 100755 integration-tests/networkElement_tests/modelUtility_test.go mode change 100644 => 100755 integration-tests/networkElement_tests/networkElement_test.go mode change 100644 => 100755 integration-tests/rbac_tests/rbac_test.go mode change 100644 => 100755 integration-tests/topology_tests/topology_test.go mode change 100644 => 100755 lab-vm/README.md mode change 100644 => 100755 lab-vm/vm-with-packer/gosdn_vm.pkr.hcl mode change 100644 => 100755 lab-vm/vm-with-packer/http/meta-data mode change 100644 => 100755 lab-vm/vm-with-packer/http/user-data mode change 100644 => 100755 lab-vm/vm-with-packer/scripts/gosdn_clone.sh mode change 100644 => 100755 lab-vm/vm-with-packer/scripts/setup.sh mode change 100644 => 100755 lab-vm/vm-with-vagrant/Vagrantfile mode change 100644 => 100755 makefiles/build/Makefile mode change 100644 => 100755 makefiles/ci/Makefile mode change 100644 => 100755 makefiles/clab/Makefile mode change 100644 => 100755 makefiles/container/Makefile mode change 100644 => 100755 makefiles/generate/Makefile mode change 100644 => 100755 mkdocs.yml mode change 100644 => 100755 models/generated/README.md mode change 100644 => 100755 models/generated/arista/additions.patch mode change 100644 => 100755 models/generated/arista/arista.go mode change 100644 => 100755 models/generated/arista/config.yaml mode change 100644 => 100755 models/generated/arista/yang.go mode change 100644 => 100755 models/generated/openconfig/additions.patch mode change 100644 => 100755 models/generated/openconfig/config.yaml mode change 100644 => 100755 models/generated/openconfig/openconfig.go mode change 100644 => 100755 models/generated/openconfig/yang.go mode change 100644 => 100755 plugin-registry/README.md mode change 100644 => 100755 plugin-registry/main.go mode change 100644 => 100755 plugin-registry/plugin-registry.Dockerfile mode change 100644 => 100755 plugin-registry/plugin-registry.Dockerfile.dockerignore mode change 100644 => 100755 plugin-registry/plugin-registry.debug.Dockerfile mode change 100644 => 100755 plugin-registry/plugin-registry.debug.Dockerfile.dockerignore mode change 100644 => 100755 plugin-registry/registry.go mode change 100644 => 100755 plugin-registry/server.go mode change 100644 => 100755 plugin-registry/store.go mode change 100644 => 100755 plugins/README.md mode change 100644 => 100755 plugins/examples/arista/cmd/main.go mode change 100644 => 100755 plugins/examples/arista/plugin.yaml mode change 100644 => 100755 plugins/examples/openconfig/cmd/main.go mode change 100644 => 100755 plugins/examples/openconfig/plugin.yaml mode change 100644 => 100755 plugins/sdk/deviceModel.go delete mode 100755 react-ui/src/components/devices/view/device.view.tabs.tsx create mode 100644 react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx delete mode 100755 react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts delete mode 100755 react-ui/src/shared/icons/icons.ts mode change 100644 => 100755 renovate.json diff --git a/.cobra.yaml b/.cobra.yaml old mode 100644 new mode 100755 diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile old mode 100644 new mode 100755 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json old mode 100644 new mode 100755 diff --git a/.dockerignore b/.dockerignore old mode 100644 new mode 100755 diff --git a/.editorconfig b/.editorconfig old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.build-binaries.yml b/.gitlab/ci/.build-binaries.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.build-container-images.yml b/.gitlab/ci/.build-container-images.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.code-quality-ci.yml b/.gitlab/ci/.code-quality-ci.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.mk-docs-deploy.yml b/.gitlab/ci/.mk-docs-deploy.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.react-ui.yml b/.gitlab/ci/.react-ui.yml new file mode 100755 index 000000000..873b694c8 --- /dev/null +++ b/.gitlab/ci/.react-ui.yml @@ -0,0 +1,3 @@ +build-react-ui: + stage: build + \ No newline at end of file diff --git a/.gitlab/ci/.release-container.yml b/.gitlab/ci/.release-container.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.renovate.yml b/.gitlab/ci/.renovate.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.security-and-compliance-ci.yml b/.gitlab/ci/.security-and-compliance-ci.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/.test.yml b/.gitlab/ci/.test.yml old mode 100644 new mode 100755 diff --git a/.gitlab/ci/gnmi-cert-integration.Dockerfile b/.gitlab/ci/gnmi-cert-integration.Dockerfile old mode 100644 new mode 100755 diff --git a/.gitlab/ci/gosdn-integration.Dockerfile b/.gitlab/ci/gosdn-integration.Dockerfile old mode 100644 new mode 100755 diff --git a/.gitlab/ci/legacy/.test.yml b/.gitlab/ci/legacy/.test.yml old mode 100644 new mode 100755 diff --git a/.gitlab/issue_templates/Change Request.md b/.gitlab/issue_templates/Change Request.md old mode 100644 new mode 100755 diff --git a/.gitlab/issue_templates/Feature Proposal.md b/.gitlab/issue_templates/Feature Proposal.md old mode 100644 new mode 100755 diff --git a/.gitlab/issue_templates/Issue Template.md b/.gitlab/issue_templates/Issue Template.md old mode 100644 new mode 100755 diff --git a/.gitlab/merge_request_templates/Default.md b/.gitlab/merge_request_templates/Default.md old mode 100644 new mode 100755 diff --git a/.gitmodules b/.gitmodules old mode 100644 new mode 100755 diff --git a/.golangci.yml b/.golangci.yml old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/api/LICENSE b/api/LICENSE old mode 100644 new mode 100755 diff --git a/api/Makefile b/api/Makefile old mode 100644 new mode 100755 diff --git a/api/README.md b/api/README.md old mode 100644 new mode 100755 diff --git a/api/buf.gen.yaml b/api/buf.gen.yaml old mode 100644 new mode 100755 diff --git a/api/buf.work.yaml b/api/buf.work.yaml old mode 100644 new mode 100755 diff --git a/api/cmd/gogen.go b/api/cmd/gogen.go old mode 100644 new mode 100755 diff --git a/api/deps/buf.yaml b/api/deps/buf.yaml old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/.github/workflows/ci-cpp-build-gnmi.yml b/api/deps/github.com/openconfig/gnmi/.github/workflows/ci-cpp-build-gnmi.yml old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/BUILD.bazel old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/CONTRIBUTING.md b/api/deps/github.com/openconfig/gnmi/CONTRIBUTING.md old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/LICENSE b/api/deps/github.com/openconfig/gnmi/LICENSE old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/README.md b/api/deps/github.com/openconfig/gnmi/README.md old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/WORKSPACE.bazel b/api/deps/github.com/openconfig/gnmi/WORKSPACE.bazel old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cache/cache.go b/api/deps/github.com/openconfig/gnmi/cache/cache.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cache/cache_test.go b/api/deps/github.com/openconfig/gnmi/cache/cache_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cli/cli.go b/api/deps/github.com/openconfig/gnmi/cli/cli.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cli/cli_test.go b/api/deps/github.com/openconfig/gnmi/cli/cli_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/cache.go b/api/deps/github.com/openconfig/gnmi/client/cache.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/cache_test.go b/api/deps/github.com/openconfig/gnmi/client/cache_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/client.go b/api/deps/github.com/openconfig/gnmi/client/client.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/client_test.go b/api/deps/github.com/openconfig/gnmi/client/client_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/fake/fake.go b/api/deps/github.com/openconfig/gnmi/client/fake/fake.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/fake/fake_test.go b/api/deps/github.com/openconfig/gnmi/client/fake/fake_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/flags_test.go b/api/deps/github.com/openconfig/gnmi/client/flags/flags_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/intmap.go b/api/deps/github.com/openconfig/gnmi/client/flags/intmap.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/stringlist.go b/api/deps/github.com/openconfig/gnmi/client/flags/stringlist.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/stringmap.go b/api/deps/github.com/openconfig/gnmi/client/flags/stringmap.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/gnmi/client.go b/api/deps/github.com/openconfig/gnmi/client/gnmi/client.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/gnmi/client_test.go b/api/deps/github.com/openconfig/gnmi/client/gnmi/client_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/gnmi/credentials.go b/api/deps/github.com/openconfig/gnmi/client/gnmi/credentials.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup.go b/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup_test.go b/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/notification.go b/api/deps/github.com/openconfig/gnmi/client/notification.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/query.go b/api/deps/github.com/openconfig/gnmi/client/query.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/reconnect.go b/api/deps/github.com/openconfig/gnmi/client/reconnect.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/reconnect_test.go b/api/deps/github.com/openconfig/gnmi/client/reconnect_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/register.go b/api/deps/github.com/openconfig/gnmi/client/register.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/client/values.go b/api/deps/github.com/openconfig/gnmi/client/values.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli_test.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/Dockerfile b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/Dockerfile old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/README.md b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/README.md old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/cert.pem b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/cert.pem old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/example.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/example.cfg old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/key.pem b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/key.pem old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/supervisord.conf b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/supervisord.conf old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector_test.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.cfg old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.crt b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.crt old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.key b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.key old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.cfg old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.crt b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.crt old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.key b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.key old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/unparseable.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/unparseable.cfg old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/coalesce/coalesce.go b/api/deps/github.com/openconfig/gnmi/coalesce/coalesce.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/coalesce/coalesce_test.go b/api/deps/github.com/openconfig/gnmi/coalesce/coalesce_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/collector/collector.go b/api/deps/github.com/openconfig/gnmi/collector/collector.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/collector/collector_test.go b/api/deps/github.com/openconfig/gnmi/collector/collector_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/connection/connection.go b/api/deps/github.com/openconfig/gnmi/connection/connection.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/connection/connection_test.go b/api/deps/github.com/openconfig/gnmi/connection/connection_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/ctree/tree.go b/api/deps/github.com/openconfig/gnmi/ctree/tree.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/ctree/tree_test.go b/api/deps/github.com/openconfig/gnmi/ctree/tree_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/errdiff/errdiff.go b/api/deps/github.com/openconfig/gnmi/errdiff/errdiff.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/errdiff/errdiff_test.go b/api/deps/github.com/openconfig/gnmi/errdiff/errdiff_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/errlist/errlist.go b/api/deps/github.com/openconfig/gnmi/errlist/errlist.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/errlist/errlist_test.go b/api/deps/github.com/openconfig/gnmi/errlist/errlist_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/gnmi_deps.bzl b/api/deps/github.com/openconfig/gnmi/gnmi_deps.bzl old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/go.mod b/api/deps/github.com/openconfig/gnmi/go.mod old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/go.sum b/api/deps/github.com/openconfig/gnmi/go.sum old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/latency/latency.go b/api/deps/github.com/openconfig/gnmi/latency/latency.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/latency/latency_test.go b/api/deps/github.com/openconfig/gnmi/latency/latency_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/manager/manager.go b/api/deps/github.com/openconfig/gnmi/manager/manager.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/manager/manager_test.go b/api/deps/github.com/openconfig/gnmi/manager/manager_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/manager/meta.go b/api/deps/github.com/openconfig/gnmi/manager/meta.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/manager/meta_test.go b/api/deps/github.com/openconfig/gnmi/manager/meta_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/match/match.go b/api/deps/github.com/openconfig/gnmi/match/match.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/match/match_test.go b/api/deps/github.com/openconfig/gnmi/match/match_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/metadata/metadata.go b/api/deps/github.com/openconfig/gnmi/metadata/metadata.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/metadata/metadata_test.go b/api/deps/github.com/openconfig/gnmi/metadata/metadata_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/metadata/yang/gnmi-collector-metadata.yang b/api/deps/github.com/openconfig/gnmi/metadata/yang/gnmi-collector-metadata.yang old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/path/path.go b/api/deps/github.com/openconfig/gnmi/path/path.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/path/path_test.go b/api/deps/github.com/openconfig/gnmi/path/path_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/collector/BUILD.bazel old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector.pb.go b/api/deps/github.com/openconfig/gnmi/proto/collector/collector.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector.proto b/api/deps/github.com/openconfig/gnmi/proto/collector/collector.proto old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go b/api/deps/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2_grpc.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/gnmi/BUILD.bazel old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.proto b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.proto old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2_grpc.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/BUILD.bazel old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/target/BUILD.bazel old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target.pb.go b/api/deps/github.com/openconfig/gnmi/proto/target/target.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target.proto b/api/deps/github.com/openconfig/gnmi/proto/target/target.proto old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2_grpc.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/subscribe/subscribe.go b/api/deps/github.com/openconfig/gnmi/subscribe/subscribe.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/subscribe/subscribe_test.go b/api/deps/github.com/openconfig/gnmi/subscribe/subscribe_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/target/target.go b/api/deps/github.com/openconfig/gnmi/target/target.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/target/target_test.go b/api/deps/github.com/openconfig/gnmi/target/target_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/agent.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/agent.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/client.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/client.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/README.md b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/README.md old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/config.pb.txt b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/config.pb.txt old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/server.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/server.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/gen_fake_config/gen_config.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/gen_fake_config/gen_config.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/gnmi_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/gnmi_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.proto b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.proto old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2.py b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2_grpc.py old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/queue/fixed_queue.go b/api/deps/github.com/openconfig/gnmi/testing/fake/queue/fixed_queue.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue.go b/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/config_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/config_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/server_option.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/server_option.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/value/value.go b/api/deps/github.com/openconfig/gnmi/value/value.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/value/value_test.go b/api/deps/github.com/openconfig/gnmi/value/value_test.go old mode 100644 new mode 100755 diff --git a/api/deps/github.com/openconfig/gnmi/watch/watch.go b/api/deps/github.com/openconfig/gnmi/watch/watch.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go b/api/go/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go old mode 100644 new mode 100755 diff --git a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/app/app.pb.go b/api/go/gosdn/app/app.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/app/app.pb.gw.go b/api/go/gosdn/app/app.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/app/app_grpc.pb.go b/api/go/gosdn/app/app_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement_grpc.pb.go b/api/go/gosdn/configurationmanagement/configurationmanagement_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/conflict/conflict.pb.go b/api/go/gosdn/conflict/conflict.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/csbi/csbi.pb.go b/api/go/gosdn/csbi/csbi.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/csbi/csbi_grpc.pb.go b/api/go/gosdn/csbi/csbi_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/networkelement/networkelement.pb.go b/api/go/gosdn/networkelement/networkelement.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/networkelement/networkelement.pb.gw.go b/api/go/gosdn/networkelement/networkelement.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/networkelement/networkelement_grpc.pb.go b/api/go/gosdn/networkelement/networkelement_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/plugin-internal/plugin-internal.pb.go b/api/go/gosdn/plugin-internal/plugin-internal.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go b/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/plugin-registry/plugin-registry.pb.go b/api/go/gosdn/plugin-registry/plugin-registry.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/plugin-registry/plugin-registry_grpc.pb.go b/api/go/gosdn/plugin-registry/plugin-registry_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/plugin/plugin.pb.go b/api/go/gosdn/plugin/plugin.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/plugin/plugin_grpc.pb.go b/api/go/gosdn/plugin/plugin_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/pnd/pnd.pb.go b/api/go/gosdn/pnd/pnd.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/pnd/pnd.pb.gw.go b/api/go/gosdn/pnd/pnd.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/pnd/pnd_grpc.pb.go b/api/go/gosdn/pnd/pnd_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/rbac.pb.go b/api/go/gosdn/rbac/rbac.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/rbac.pb.gw.go b/api/go/gosdn/rbac/rbac.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/rbac_grpc.pb.go b/api/go/gosdn/rbac/rbac_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/role.pb.go b/api/go/gosdn/rbac/role.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/role.pb.gw.go b/api/go/gosdn/rbac/role.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/role_grpc.pb.go b/api/go/gosdn/rbac/role_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/user.pb.go b/api/go/gosdn/rbac/user.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/user.pb.gw.go b/api/go/gosdn/rbac/user.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/rbac/user_grpc.pb.go b/api/go/gosdn/rbac/user_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/southbound/southbound.pb.go b/api/go/gosdn/southbound/southbound.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/southbound/southbound_grpc.pb.go b/api/go/gosdn/southbound/southbound_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement_grpc.pb.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/link.pb.go b/api/go/gosdn/topology/link.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/node.pb.go b/api/go/gosdn/topology/node.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/port.pb.go b/api/go/gosdn/topology/port.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/route.pb.go b/api/go/gosdn/topology/route.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/routingTable.pb.go b/api/go/gosdn/topology/routingTable.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/routingTable.pb.gw.go b/api/go/gosdn/topology/routingTable.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/routingTable_grpc.pb.go b/api/go/gosdn/topology/routingTable_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/topology.pb.go b/api/go/gosdn/topology/topology.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/topology.pb.gw.go b/api/go/gosdn/topology/topology.pb.gw.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/topology/topology_grpc.pb.go b/api/go/gosdn/topology/topology_grpc.pb.go old mode 100644 new mode 100755 diff --git a/api/go/gosdn/transport/transport.pb.go b/api/go/gosdn/transport/transport.pb.go old mode 100644 new mode 100755 diff --git a/api/openapiv2/gosdn_northbound.swagger.json b/api/openapiv2/gosdn_northbound.swagger.json old mode 100644 new mode 100755 diff --git a/api/proto/buf.lock b/api/proto/buf.lock old mode 100644 new mode 100755 diff --git a/api/proto/buf.yaml b/api/proto/buf.yaml old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/app/app.proto b/api/proto/gosdn/app/app.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/configurationmanagement/configurationmanagement.proto b/api/proto/gosdn/configurationmanagement/configurationmanagement.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/conflict/conflict.proto b/api/proto/gosdn/conflict/conflict.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/csbi/csbi.proto b/api/proto/gosdn/csbi/csbi.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/networkelement/networkelement.proto b/api/proto/gosdn/networkelement/networkelement.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/plugin-internal/plugin-internal.proto b/api/proto/gosdn/plugin-internal/plugin-internal.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/plugin-registry/plugin-registry.proto b/api/proto/gosdn/plugin-registry/plugin-registry.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/plugin/plugin.proto b/api/proto/gosdn/plugin/plugin.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/pnd/pnd.proto b/api/proto/gosdn/pnd/pnd.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/rbac/rbac.proto b/api/proto/gosdn/rbac/rbac.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/rbac/role.proto b/api/proto/gosdn/rbac/role.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/rbac/user.proto b/api/proto/gosdn/rbac/user.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/southbound/southbound.proto b/api/proto/gosdn/southbound/southbound.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/subscriptionmanagement/subscriptionmanagement.proto b/api/proto/gosdn/subscriptionmanagement/subscriptionmanagement.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/topology/link.proto b/api/proto/gosdn/topology/link.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/topology/node.proto b/api/proto/gosdn/topology/node.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/topology/port.proto b/api/proto/gosdn/topology/port.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/topology/route.proto b/api/proto/gosdn/topology/route.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/topology/routingTable.proto b/api/proto/gosdn/topology/routingTable.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/topology/topology.proto b/api/proto/gosdn/topology/topology.proto old mode 100644 new mode 100755 diff --git a/api/proto/gosdn/transport/transport.proto b/api/proto/gosdn/transport/transport.proto old mode 100644 new mode 100755 diff --git a/api/third_party/validator/validator.proto b/api/third_party/validator/validator.proto old mode 100644 new mode 100755 diff --git a/application-framework/event/event.go b/application-framework/event/event.go old mode 100644 new mode 100755 diff --git a/application-framework/event/eventService.go b/application-framework/event/eventService.go old mode 100644 new mode 100755 diff --git a/application-framework/event/event_test.go b/application-framework/event/event_test.go old mode 100644 new mode 100755 diff --git a/application-framework/event/topics.go b/application-framework/event/topics.go old mode 100644 new mode 100755 diff --git a/application-framework/event/type.go b/application-framework/event/type.go old mode 100644 new mode 100755 diff --git a/application-framework/models/model-handling.go b/application-framework/models/model-handling.go old mode 100644 new mode 100755 diff --git a/application-framework/models/model-handling_test.go b/application-framework/models/model-handling_test.go old mode 100644 new mode 100755 diff --git a/application-framework/registration/registration.go b/application-framework/registration/registration.go old mode 100644 new mode 100755 diff --git a/applications/arista-routing-engine/app.go b/applications/arista-routing-engine/app.go old mode 100644 new mode 100755 diff --git a/applications/arista-routing-engine/arista-routing-engine.Dockerfile b/applications/arista-routing-engine/arista-routing-engine.Dockerfile old mode 100644 new mode 100755 diff --git a/applications/arista-routing-engine/arista-routing-engine.Dockerfile.dockerignore b/applications/arista-routing-engine/arista-routing-engine.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/applications/arista-routing-engine/main.go b/applications/arista-routing-engine/main.go old mode 100644 new mode 100755 diff --git a/applications/arista-routing-engine/network-element.go b/applications/arista-routing-engine/network-element.go old mode 100644 new mode 100755 diff --git a/applications/arista-routing-engine/routing.go b/applications/arista-routing-engine/routing.go old mode 100644 new mode 100755 diff --git a/applications/basic-interface-monitoring/app.go b/applications/basic-interface-monitoring/app.go old mode 100644 new mode 100755 diff --git a/applications/basic-interface-monitoring/http.go b/applications/basic-interface-monitoring/http.go old mode 100644 new mode 100755 diff --git a/applications/basic-interface-monitoring/main.go b/applications/basic-interface-monitoring/main.go old mode 100644 new mode 100755 diff --git a/applications/basic-interface-monitoring/network-element.go b/applications/basic-interface-monitoring/network-element.go old mode 100644 new mode 100755 diff --git a/applications/basic-interface-monitoring/webpage/index.html b/applications/basic-interface-monitoring/webpage/index.html old mode 100644 new mode 100755 diff --git a/applications/hostname-checker/app.go b/applications/hostname-checker/app.go old mode 100644 new mode 100755 diff --git a/applications/hostname-checker/device.go b/applications/hostname-checker/device.go old mode 100644 new mode 100755 diff --git a/applications/hostname-checker/main.go b/applications/hostname-checker/main.go old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/README.md b/applications/inventory-manager/README.md old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/config/config.go b/applications/inventory-manager/config/config.go old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/example.yml b/applications/inventory-manager/example.yml old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/inventory-manager.Dockerfile b/applications/inventory-manager/inventory-manager.Dockerfile old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/inventory-manager.Dockerfile.dockerignore b/applications/inventory-manager/inventory-manager.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/inventoryManager/inventoryManager.go b/applications/inventory-manager/inventoryManager/inventoryManager.go old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/inventoryManager/util.go b/applications/inventory-manager/inventoryManager/util.go old mode 100644 new mode 100755 diff --git a/applications/inventory-manager/main.go b/applications/inventory-manager/main.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/Readme.md b/applications/venv-manager/Readme.md old mode 100644 new mode 100755 diff --git a/applications/venv-manager/containerlab/containerlab.go b/applications/venv-manager/containerlab/containerlab.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/links/link.go b/applications/venv-manager/links/link.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/main.go b/applications/venv-manager/main.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/node/node.go b/applications/venv-manager/node/node.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/port/port.go b/applications/venv-manager/port/port.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/topology/topology.go b/applications/venv-manager/topology/topology.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/venv-manager.Dockerfile b/applications/venv-manager/venv-manager.Dockerfile old mode 100644 new mode 100755 diff --git a/applications/venv-manager/venv-manager.Dockerfile.dockerignore b/applications/venv-manager/venv-manager.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/applications/venv-manager/venv-manager/venv-manager.go b/applications/venv-manager/venv-manager/venv-manager.go old mode 100644 new mode 100755 diff --git a/applications/venv-manager/yang-parser/yang-parser.go b/applications/venv-manager/yang-parser/yang-parser.go old mode 100644 new mode 100755 diff --git a/applications/ws-events/app.go b/applications/ws-events/app.go old mode 100644 new mode 100755 diff --git a/applications/ws-events/main.go b/applications/ws-events/main.go old mode 100644 new mode 100755 diff --git a/applications/ws-events/ws-events.Dockerfile b/applications/ws-events/ws-events.Dockerfile old mode 100644 new mode 100755 diff --git a/applications/ws-events/ws-events.Dockerfile.dockerignore b/applications/ws-events/ws-events.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/applications/ws-events/ws.go b/applications/ws-events/ws.go old mode 100644 new mode 100755 diff --git a/cli/LICENSE b/cli/LICENSE old mode 100644 new mode 100755 diff --git a/cli/README.md b/cli/README.md old mode 100644 new mode 100755 diff --git a/cli/adapter/PndAdapter.go b/cli/adapter/PndAdapter.go old mode 100644 new mode 100755 diff --git a/cli/adapter/PndAdapter_test.go b/cli/adapter/PndAdapter_test.go old mode 100644 new mode 100755 diff --git a/cli/build/ci/.security-and-compliance-ci.yml b/cli/build/ci/.security-and-compliance-ci.yml old mode 100644 new mode 100755 diff --git a/cli/build/ci/.test.yml b/cli/build/ci/.test.yml old mode 100644 new mode 100755 diff --git a/cli/cli.Dockerfile b/cli/cli.Dockerfile old mode 100644 new mode 100755 diff --git a/cli/cli.Dockerfile.dockerignore b/cli/cli.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/cli/cmd/change.go b/cli/cmd/change.go old mode 100644 new mode 100755 diff --git a/cli/cmd/changeCommit.go b/cli/cmd/changeCommit.go old mode 100644 new mode 100755 diff --git a/cli/cmd/changeConfirm.go b/cli/cmd/changeConfirm.go old mode 100644 new mode 100755 diff --git a/cli/cmd/changeGet.go b/cli/cmd/changeGet.go old mode 100644 new mode 100755 diff --git a/cli/cmd/changeList.go b/cli/cmd/changeList.go old mode 100644 new mode 100755 diff --git a/cli/cmd/config/.gosdnc.toml b/cli/cmd/config/.gosdnc.toml old mode 100644 new mode 100755 diff --git a/cli/cmd/list.go b/cli/cmd/list.go old mode 100644 new mode 100755 diff --git a/cli/cmd/login.go b/cli/cmd/login.go old mode 100644 new mode 100755 diff --git a/cli/cmd/logout.go b/cli/cmd/logout.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElement.go b/cli/cmd/networkElement.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementCreate.go b/cli/cmd/networkElementCreate.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementList.go b/cli/cmd/networkElementList.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementPath.go b/cli/cmd/networkElementPath.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementPathDelete.go b/cli/cmd/networkElementPathDelete.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementPathGet.go b/cli/cmd/networkElementPathGet.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementPathGetIntended.go b/cli/cmd/networkElementPathGetIntended.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementPathSet.go b/cli/cmd/networkElementPathSet.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementRemove.go b/cli/cmd/networkElementRemove.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementShow.go b/cli/cmd/networkElementShow.go old mode 100644 new mode 100755 diff --git a/cli/cmd/networkElementSubscribe.go b/cli/cmd/networkElementSubscribe.go old mode 100644 new mode 100755 diff --git a/cli/cmd/plugin.go b/cli/cmd/plugin.go old mode 100644 new mode 100755 diff --git a/cli/cmd/pluginList.go b/cli/cmd/pluginList.go old mode 100644 new mode 100755 diff --git a/cli/cmd/pnd.go b/cli/cmd/pnd.go old mode 100644 new mode 100755 diff --git a/cli/cmd/pndCreate.go b/cli/cmd/pndCreate.go old mode 100644 new mode 100755 diff --git a/cli/cmd/pndGet.go b/cli/cmd/pndGet.go old mode 100644 new mode 100755 diff --git a/cli/cmd/pndList.go b/cli/cmd/pndList.go old mode 100644 new mode 100755 diff --git a/cli/cmd/pndRemove.go b/cli/cmd/pndRemove.go old mode 100644 new mode 100755 diff --git a/cli/cmd/pndUse.go b/cli/cmd/pndUse.go old mode 100644 new mode 100755 diff --git a/cli/cmd/prompt.go b/cli/cmd/prompt.go old mode 100644 new mode 100755 diff --git a/cli/cmd/role.go b/cli/cmd/role.go old mode 100644 new mode 100755 diff --git a/cli/cmd/roleCreate.go b/cli/cmd/roleCreate.go old mode 100644 new mode 100755 diff --git a/cli/cmd/roleGetAll.go b/cli/cmd/roleGetAll.go old mode 100644 new mode 100755 diff --git a/cli/cmd/root.go b/cli/cmd/root.go old mode 100644 new mode 100755 diff --git a/cli/cmd/subManagement.go b/cli/cmd/subManagement.go old mode 100644 new mode 100755 diff --git a/cli/cmd/subManagementGetAll.go b/cli/cmd/subManagementGetAll.go old mode 100644 new mode 100755 diff --git a/cli/cmd/subManagementResetAll.go b/cli/cmd/subManagementResetAll.go old mode 100644 new mode 100755 diff --git a/cli/cmd/user.go b/cli/cmd/user.go old mode 100644 new mode 100755 diff --git a/cli/cmd/userCreate.go b/cli/cmd/userCreate.go old mode 100644 new mode 100755 diff --git a/cli/cmd/userDelete.go b/cli/cmd/userDelete.go old mode 100644 new mode 100755 diff --git a/cli/cmd/userGet.go b/cli/cmd/userGet.go old mode 100644 new mode 100755 diff --git a/cli/cmd/userGetAll.go b/cli/cmd/userGetAll.go old mode 100644 new mode 100755 diff --git a/cli/cmd/userUpdate.go b/cli/cmd/userUpdate.go old mode 100644 new mode 100755 diff --git a/cli/cmd/utils.go b/cli/cmd/utils.go old mode 100644 new mode 100755 diff --git a/cli/cmd/utils_test.go b/cli/cmd/utils_test.go old mode 100644 new mode 100755 diff --git a/cli/completer/utils.go b/cli/completer/utils.go old mode 100644 new mode 100755 diff --git a/cli/completer/yangSchemaCompleter.go b/cli/completer/yangSchemaCompleter.go old mode 100644 new mode 100755 diff --git a/cli/config/.cobra.yaml b/cli/config/.cobra.yaml old mode 100644 new mode 100755 diff --git a/cli/config/gosdnc.toml.example b/cli/config/gosdnc.toml.example old mode 100644 new mode 100755 diff --git a/cli/main.go b/cli/main.go old mode 100644 new mode 100755 diff --git a/cli/test/containerlab/integrationtest.clab.tmpl.yml b/cli/test/containerlab/integrationtest.clab.tmpl.yml old mode 100644 new mode 100755 diff --git a/cli/test/containerlab/integrationtest_branch.clab.tmpl.yml b/cli/test/containerlab/integrationtest_branch.clab.tmpl.yml old mode 100644 new mode 100755 diff --git a/config.js b/config.js old mode 100644 new mode 100755 diff --git a/controller/ARCHITECTURE.md b/controller/ARCHITECTURE.md old mode 100644 new mode 100755 diff --git a/controller/CONTRIBUTING.md b/controller/CONTRIBUTING.md old mode 100644 new mode 100755 diff --git a/controller/Dockerfile.debug b/controller/Dockerfile.debug old mode 100644 new mode 100755 diff --git a/controller/Makefile b/controller/Makefile old mode 100644 new mode 100755 diff --git a/controller/README.md b/controller/README.md old mode 100644 new mode 100755 diff --git a/controller/api/apiUtil_test.go b/controller/api/apiUtil_test.go old mode 100644 new mode 100755 diff --git a/controller/api/api_test.go b/controller/api/api_test.go old mode 100644 new mode 100755 diff --git a/controller/api/api_test.toml b/controller/api/api_test.toml old mode 100644 new mode 100755 diff --git a/controller/api/app.go b/controller/api/app.go old mode 100644 new mode 100755 diff --git a/controller/api/auth.go b/controller/api/auth.go old mode 100644 new mode 100755 diff --git a/controller/api/auth_test.go b/controller/api/auth_test.go old mode 100644 new mode 100755 diff --git a/controller/api/change.go b/controller/api/change.go old mode 100644 new mode 100755 diff --git a/controller/api/configurationManagement.go b/controller/api/configurationManagement.go old mode 100644 new mode 100755 diff --git a/controller/api/grpc.go b/controller/api/grpc.go old mode 100644 new mode 100755 diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go old mode 100644 new mode 100755 diff --git a/controller/api/managedNetworkElement.go b/controller/api/managedNetworkElement.go old mode 100644 new mode 100755 diff --git a/controller/api/plugin.go b/controller/api/plugin.go old mode 100644 new mode 100755 diff --git a/controller/api/pnd.go b/controller/api/pnd.go old mode 100644 new mode 100755 diff --git a/controller/api/role.go b/controller/api/role.go old mode 100644 new mode 100755 diff --git a/controller/api/role_test.go b/controller/api/role_test.go old mode 100644 new mode 100755 diff --git a/controller/api/subManagement.go b/controller/api/subManagement.go old mode 100644 new mode 100755 diff --git a/controller/api/user.go b/controller/api/user.go old mode 100644 new mode 100755 diff --git a/controller/api/user_test.go b/controller/api/user_test.go old mode 100644 new mode 100755 diff --git a/controller/app/DatabaseStore.go b/controller/app/DatabaseStore.go old mode 100644 new mode 100755 diff --git a/controller/app/Service.go b/controller/app/Service.go old mode 100644 new mode 100755 diff --git a/controller/app/app.go b/controller/app/app.go old mode 100644 new mode 100755 diff --git a/controller/app/store.go b/controller/app/store.go old mode 100644 new mode 100755 diff --git a/controller/app/utils.go b/controller/app/utils.go old mode 100644 new mode 100755 diff --git a/controller/cmd/gosdn/main.go b/controller/cmd/gosdn/main.go old mode 100644 new mode 100755 diff --git a/controller/cmd/root.go b/controller/cmd/root.go old mode 100644 new mode 100755 diff --git a/controller/cmd/version.go b/controller/cmd/version.go old mode 100644 new mode 100755 diff --git a/controller/config/config.go b/controller/config/config.go old mode 100644 new mode 100755 diff --git a/controller/config/config_test.go b/controller/config/config_test.go old mode 100644 new mode 100755 diff --git a/controller/config/environment.go b/controller/config/environment.go old mode 100644 new mode 100755 diff --git a/controller/config/gnmiSubscriptionConfig.go b/controller/config/gnmiSubscriptionConfig.go old mode 100644 new mode 100755 diff --git a/controller/configs/.gitkeep b/controller/configs/.gitkeep old mode 100644 new mode 100755 diff --git a/controller/configs/basic-docker-compose.toml b/controller/configs/basic-docker-compose.toml old mode 100644 new mode 100755 diff --git a/controller/configs/containerlab-gosdn.toml.example b/controller/configs/containerlab-gosdn.toml.example old mode 100644 new mode 100755 diff --git a/controller/configs/development-gosdn.toml.example b/controller/configs/development-gosdn.toml.example old mode 100644 new mode 100755 diff --git a/controller/configs/gNMISubscriptions.txt.example b/controller/configs/gNMISubscriptions.txt.example old mode 100644 new mode 100755 diff --git a/controller/configs/integration-test-gosdn.toml b/controller/configs/integration-test-gosdn.toml old mode 100644 new mode 100755 diff --git a/controller/conflict/versioning.go b/controller/conflict/versioning.go old mode 100644 new mode 100755 diff --git a/controller/controller.Dockerfile b/controller/controller.Dockerfile old mode 100644 new mode 100755 diff --git a/controller/controller.Dockerfile.dockerignore b/controller/controller.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/controller/controller.go b/controller/controller.go old mode 100644 new mode 100755 diff --git a/controller/controller_test.go b/controller/controller_test.go old mode 100644 new mode 100755 diff --git a/controller/customerrs/errors.go b/controller/customerrs/errors.go old mode 100644 new mode 100755 diff --git a/controller/event/event.go b/controller/event/event.go old mode 100644 new mode 100755 diff --git a/controller/event/event_test.go b/controller/event/event_test.go old mode 100644 new mode 100755 diff --git a/controller/eventService/Service.go b/controller/eventService/Service.go old mode 100644 new mode 100755 diff --git a/controller/eventService/utils.go b/controller/eventService/utils.go old mode 100644 new mode 100755 diff --git a/controller/http.go b/controller/http.go old mode 100644 new mode 100755 diff --git a/controller/http_test.go b/controller/http_test.go old mode 100644 new mode 100755 diff --git a/controller/initialise_test.go b/controller/initialise_test.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/change/change.go b/controller/interfaces/change/change.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/event/service.go b/controller/interfaces/event/service.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/networkdomain/pnd.go b/controller/interfaces/networkdomain/pnd.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/networkdomain/pndService.go b/controller/interfaces/networkdomain/pndService.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/networkdomain/pndStore.go b/controller/interfaces/networkdomain/pndStore.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/networkelement/networkElement.go b/controller/interfaces/networkelement/networkElement.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/networkelement/networkElementService.go b/controller/interfaces/networkelement/networkElementService.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/networkelement/networkElementStore.go b/controller/interfaces/networkelement/networkElementStore.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/plugin/plugin.go b/controller/interfaces/plugin/plugin.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/plugin/pluginService.go b/controller/interfaces/plugin/pluginService.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/plugin/pluginStore.go b/controller/interfaces/plugin/pluginStore.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/rbac/rbacService.go b/controller/interfaces/rbac/rbacService.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/rbac/role.go b/controller/interfaces/rbac/role.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/rbac/roleStore.go b/controller/interfaces/rbac/roleStore.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/rbac/user.go b/controller/interfaces/rbac/user.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/rbac/userStore.go b/controller/interfaces/rbac/userStore.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/store/store.go b/controller/interfaces/store/store.go old mode 100644 new mode 100755 diff --git a/controller/interfaces/transport/transport.go b/controller/interfaces/transport/transport.go old mode 100644 new mode 100755 diff --git a/controller/metrics/prometheus.go b/controller/metrics/prometheus.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Change.go b/controller/mocks/Change.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Csbi.go b/controller/mocks/Csbi.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Device.go b/controller/mocks/Device.go old mode 100644 new mode 100755 diff --git a/controller/mocks/GNMIClient.go b/controller/mocks/GNMIClient.go old mode 100644 new mode 100755 diff --git a/controller/mocks/GNMIServer.go b/controller/mocks/GNMIServer.go old mode 100644 new mode 100755 diff --git a/controller/mocks/GNMI_SubscribeClient.go b/controller/mocks/GNMI_SubscribeClient.go old mode 100644 new mode 100755 diff --git a/controller/mocks/GNMI_SubscribeServer.go b/controller/mocks/GNMI_SubscribeServer.go old mode 100644 new mode 100755 diff --git a/controller/mocks/GenericGoStructClient.go b/controller/mocks/GenericGoStructClient.go old mode 100644 new mode 100755 diff --git a/controller/mocks/HandleSubscribeResponse.go b/controller/mocks/HandleSubscribeResponse.go old mode 100644 new mode 100755 diff --git a/controller/mocks/NetworkDomain.go b/controller/mocks/NetworkDomain.go old mode 100644 new mode 100755 diff --git a/controller/mocks/NetworkElement.go b/controller/mocks/NetworkElement.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Plugin.go b/controller/mocks/Plugin.go old mode 100644 new mode 100755 diff --git a/controller/mocks/PluginRegistryServiceClient.go b/controller/mocks/PluginRegistryServiceClient.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Plugin_additions.go b/controller/mocks/Plugin_additions.go old mode 100644 new mode 100755 diff --git a/controller/mocks/PndService.go b/controller/mocks/PndService.go old mode 100644 new mode 100755 diff --git a/controller/mocks/PndStore.go b/controller/mocks/PndStore.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Pnd_Additions.go b/controller/mocks/Pnd_Additions.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Role.go b/controller/mocks/Role.go old mode 100644 new mode 100755 diff --git a/controller/mocks/RoleService.go b/controller/mocks/RoleService.go old mode 100644 new mode 100755 diff --git a/controller/mocks/RoleStore.go b/controller/mocks/RoleStore.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Service.go b/controller/mocks/Service.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Storable.go b/controller/mocks/Storable.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Store.go b/controller/mocks/Store.go old mode 100644 new mode 100755 diff --git a/controller/mocks/Transport.go b/controller/mocks/Transport.go old mode 100644 new mode 100755 diff --git a/controller/mocks/UnsafeGNMIServer.go b/controller/mocks/UnsafeGNMIServer.go old mode 100644 new mode 100755 diff --git a/controller/mocks/User.go b/controller/mocks/User.go old mode 100644 new mode 100755 diff --git a/controller/mocks/UserService.go b/controller/mocks/UserService.go old mode 100644 new mode 100755 diff --git a/controller/mocks/UserStore.go b/controller/mocks/UserStore.go old mode 100644 new mode 100755 diff --git a/controller/mocks/isSubscribeRequest_Request.go b/controller/mocks/isSubscribeRequest_Request.go old mode 100644 new mode 100755 diff --git a/controller/mocks/isSubscribeResponse_Response.go b/controller/mocks/isSubscribeResponse_Response.go old mode 100644 new mode 100755 diff --git a/controller/mocks/isTypedValue_Value.go b/controller/mocks/isTypedValue_Value.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/app.go b/controller/northbound/client/app.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/configurationManagement.go b/controller/northbound/client/configurationManagement.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/networkElement.go b/controller/northbound/client/networkElement.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/plugin.go b/controller/northbound/client/plugin.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/pnd.go b/controller/northbound/client/pnd.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/rbac.go b/controller/northbound/client/rbac.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/sbi.go b/controller/northbound/client/sbi.go old mode 100644 new mode 100755 diff --git a/controller/northbound/client/submanagement.go b/controller/northbound/client/submanagement.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/app.go b/controller/northbound/server/app.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/auth.go b/controller/northbound/server/auth.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/auth_interceptor.go b/controller/northbound/server/auth_interceptor.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/auth_test.go b/controller/northbound/server/auth_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/configurationmanagement.go b/controller/northbound/server/configurationmanagement.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/csbi.go b/controller/northbound/server/csbi.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/metrics.go b/controller/northbound/server/metrics.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/networkElement_test.go b/controller/northbound/server/networkElement_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/plugin.go b/controller/northbound/server/plugin.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/role.go b/controller/northbound/server/role.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/role_test.go b/controller/northbound/server/role_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/route.go b/controller/northbound/server/route.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/submanagement.go b/controller/northbound/server/submanagement.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/test_util_test.go b/controller/northbound/server/test_util_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/topology.go b/controller/northbound/server/topology.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/topology_test.go b/controller/northbound/server/topology_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/user.go b/controller/northbound/server/user.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/user_test.go b/controller/northbound/server/user_test.go old mode 100644 new mode 100755 diff --git a/controller/northbound/server/utils_test.go b/controller/northbound/server/utils_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/change.go b/controller/nucleus/change.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/change_test.go b/controller/nucleus/change_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/clientConfig.go b/controller/nucleus/clientConfig.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/database/mongo-connection.go b/controller/nucleus/database/mongo-connection.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/databaseNetworkElementStore.go b/controller/nucleus/databaseNetworkElementStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/databasePluginStore.go b/controller/nucleus/databasePluginStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/databasePndStore.go b/controller/nucleus/databasePndStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/genericService.go b/controller/nucleus/genericService.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/gnmi_transport.go b/controller/nucleus/gnmi_transport.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/gnmi_transport_test.go b/controller/nucleus/gnmi_transport_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/memoryNetworkElementStore.go b/controller/nucleus/memoryNetworkElementStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/memoryPluginStore.go b/controller/nucleus/memoryPluginStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/memoryPndStore.go b/controller/nucleus/memoryPndStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElement.go b/controller/nucleus/networkElement.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElementFilesystemStore.go b/controller/nucleus/networkElementFilesystemStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElementFilesystemStore_test.go b/controller/nucleus/networkElementFilesystemStore_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElementService.go b/controller/nucleus/networkElementService.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElementServiceMock.go b/controller/nucleus/networkElementServiceMock.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElementService_test.go b/controller/nucleus/networkElementService_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElementStore.go b/controller/nucleus/networkElementStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/networkElement_test.go b/controller/nucleus/networkElement_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/plugin.go b/controller/nucleus/plugin.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pluginFilesystemStore.go b/controller/nucleus/pluginFilesystemStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pluginFilesystemStore_test.go b/controller/nucleus/pluginFilesystemStore_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pluginService.go b/controller/nucleus/pluginService.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pluginServiceMock.go b/controller/nucleus/pluginServiceMock.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pluginStore.go b/controller/nucleus/pluginStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/plugin_test.go b/controller/nucleus/plugin_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pndFilesystemStore.go b/controller/nucleus/pndFilesystemStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pndFilesystemStore_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pndService.go b/controller/nucleus/pndService.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/pndStore.go b/controller/nucleus/pndStore.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/principalNetworkDomain.go b/controller/nucleus/principalNetworkDomain.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/principalNetworkDomain_test.go b/controller/nucleus/principalNetworkDomain_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/restconf_transport.go b/controller/nucleus/restconf_transport.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/restconf_transport_test.go b/controller/nucleus/restconf_transport_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/subscriptionQueueHandler.go b/controller/nucleus/subscriptionQueueHandler.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/transport.go b/controller/nucleus/transport.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/transport_test.go b/controller/nucleus/transport_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/types/types.go b/controller/nucleus/types/types.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/gnmi/convert.go b/controller/nucleus/util/gnmi/convert.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/gnmi/notification.go b/controller/nucleus/util/gnmi/notification.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/path/translate.go b/controller/nucleus/util/path/translate.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/path/traverse.go b/controller/nucleus/util/path/traverse.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/path/traverse_test.go b/controller/nucleus/util/path/traverse_test.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/plugin.go b/controller/nucleus/util/plugin.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/proto/message.go b/controller/nucleus/util/proto/message.go old mode 100644 new mode 100755 diff --git a/controller/nucleus/util/proto/message_test.go b/controller/nucleus/util/proto/message_test.go old mode 100644 new mode 100755 diff --git a/controller/plugin/shared/client.go b/controller/plugin/shared/client.go old mode 100644 new mode 100755 diff --git a/controller/plugin/shared/interface.go b/controller/plugin/shared/interface.go old mode 100644 new mode 100755 diff --git a/controller/plugin/shared/server.go b/controller/plugin/shared/server.go old mode 100644 new mode 100755 diff --git a/controller/plugin/shared/util.go b/controller/plugin/shared/util.go old mode 100644 new mode 100755 diff --git a/controller/rbac/databaseRoleStore.go b/controller/rbac/databaseRoleStore.go old mode 100644 new mode 100755 diff --git a/controller/rbac/databaseUserStore.go b/controller/rbac/databaseUserStore.go old mode 100644 new mode 100755 diff --git a/controller/rbac/jwtManager.go b/controller/rbac/jwtManager.go old mode 100644 new mode 100755 diff --git a/controller/rbac/jwtManager_test.go b/controller/rbac/jwtManager_test.go old mode 100644 new mode 100755 diff --git a/controller/rbac/memoryRoleStore.go b/controller/rbac/memoryRoleStore.go old mode 100644 new mode 100755 diff --git a/controller/rbac/memoryUserStore.go b/controller/rbac/memoryUserStore.go old mode 100644 new mode 100755 diff --git a/controller/rbac/rbacService.go b/controller/rbac/rbacService.go old mode 100644 new mode 100755 diff --git a/controller/rbac/rbacTestUtil_test.go b/controller/rbac/rbacTestUtil_test.go old mode 100644 new mode 100755 diff --git a/controller/rbac/role.go b/controller/rbac/role.go old mode 100644 new mode 100755 diff --git a/controller/rbac/roleFileSystemStore.go b/controller/rbac/roleFileSystemStore.go old mode 100644 new mode 100755 diff --git a/controller/rbac/roleFileSystemStore_test.go b/controller/rbac/roleFileSystemStore_test.go old mode 100644 new mode 100755 diff --git a/controller/rbac/roleStore.go b/controller/rbac/roleStore.go old mode 100644 new mode 100755 diff --git a/controller/rbac/user.go b/controller/rbac/user.go old mode 100644 new mode 100755 diff --git a/controller/rbac/userFileSystemStore.go b/controller/rbac/userFileSystemStore.go old mode 100644 new mode 100755 diff --git a/controller/rbac/userFileSystemStore_test.go b/controller/rbac/userFileSystemStore_test.go old mode 100644 new mode 100755 diff --git a/controller/rbac/userStore.go b/controller/rbac/userStore.go old mode 100644 new mode 100755 diff --git a/controller/store/changeStores.go b/controller/store/changeStores.go old mode 100644 new mode 100755 diff --git a/controller/store/filesystem-settings.go b/controller/store/filesystem-settings.go old mode 100644 new mode 100755 diff --git a/controller/store/genericStore.go b/controller/store/genericStore.go old mode 100644 new mode 100755 diff --git a/controller/store/initialise_test.go b/controller/store/initialise_test.go old mode 100644 new mode 100755 diff --git a/controller/store/oldGenericStore.go b/controller/store/oldGenericStore.go old mode 100644 new mode 100755 diff --git a/controller/store/query.go b/controller/store/query.go old mode 100644 new mode 100755 diff --git a/controller/store/storageMode.go b/controller/store/storageMode.go old mode 100644 new mode 100755 diff --git a/controller/store/utils.go b/controller/store/utils.go old mode 100644 new mode 100755 diff --git a/controller/test/arista-interface-response.json b/controller/test/arista-interface-response.json old mode 100644 new mode 100755 diff --git a/controller/test/arista-interface-response2.json b/controller/test/arista-interface-response2.json old mode 100644 new mode 100755 diff --git a/controller/test/arista-root-response.json b/controller/test/arista-root-response.json old mode 100644 new mode 100755 diff --git a/controller/test/containerlab/complex-1.0.clab.tmpl.yml b/controller/test/containerlab/complex-1.0.clab.tmpl.yml old mode 100644 new mode 100755 diff --git a/controller/test/containerlab/complex-1.0.png b/controller/test/containerlab/complex-1.0.png old mode 100644 new mode 100755 diff --git a/controller/test/containerlab/dev.clab.tmpl.yml b/controller/test/containerlab/dev.clab.tmpl.yml old mode 100644 new mode 100755 diff --git a/controller/test/containerlab/int01.clab.tmpl.yml b/controller/test/containerlab/int01.clab.tmpl.yml old mode 100644 new mode 100755 diff --git a/controller/test/plugin/csbiAdditions.go b/controller/test/plugin/csbiAdditions.go old mode 100644 new mode 100755 diff --git a/controller/test/plugin/faulty/csbiAdditions.go b/controller/test/plugin/faulty/csbiAdditions.go old mode 100644 new mode 100755 diff --git a/controller/test/plugin/faulty/gostructs.go b/controller/test/plugin/faulty/gostructs.go old mode 100644 new mode 100755 diff --git a/controller/test/plugin/faulty/plugin.yml b/controller/test/plugin/faulty/plugin.yml old mode 100644 new mode 100755 diff --git a/controller/test/plugin/gostructs.go b/controller/test/plugin/gostructs.go old mode 100644 new mode 100755 diff --git a/controller/test/plugin/plugin.yml b/controller/test/plugin/plugin.yml old mode 100644 new mode 100755 diff --git a/controller/test/proto/cap-resp-arista-ceos b/controller/test/proto/cap-resp-arista-ceos old mode 100644 new mode 100755 diff --git a/controller/test/proto/req-full-node b/controller/test/proto/req-full-node old mode 100644 new mode 100755 diff --git a/controller/test/proto/req-full-node-arista-ceos b/controller/test/proto/req-full-node-arista-ceos old mode 100644 new mode 100755 diff --git a/controller/test/proto/req-interfaces-arista-ceos b/controller/test/proto/req-interfaces-arista-ceos old mode 100644 new mode 100755 diff --git a/controller/test/proto/req-interfaces-interface-arista-ceos b/controller/test/proto/req-interfaces-interface-arista-ceos old mode 100644 new mode 100755 diff --git a/controller/test/proto/req-interfaces-wildcard b/controller/test/proto/req-interfaces-wildcard old mode 100644 new mode 100755 diff --git a/controller/test/proto/resp-full-node b/controller/test/proto/resp-full-node old mode 100644 new mode 100755 diff --git a/controller/test/proto/resp-full-node-arista-ceos b/controller/test/proto/resp-full-node-arista-ceos old mode 100644 new mode 100755 diff --git a/controller/test/proto/resp-interfaces-arista-ceos b/controller/test/proto/resp-interfaces-arista-ceos old mode 100644 new mode 100755 diff --git a/controller/test/proto/resp-interfaces-interface-arista-ceos b/controller/test/proto/resp-interfaces-interface-arista-ceos old mode 100644 new mode 100755 diff --git a/controller/test/proto/resp-interfaces-wildcard b/controller/test/proto/resp-interfaces-wildcard old mode 100644 new mode 100755 diff --git a/controller/test/proto/resp-set-system-config-hostname b/controller/test/proto/resp-set-system-config-hostname old mode 100644 new mode 100755 diff --git a/controller/test/targets.go b/controller/test/targets.go old mode 100644 new mode 100755 diff --git a/controller/test/terraform/.docker/ca.pem b/controller/test/terraform/.docker/ca.pem old mode 100644 new mode 100755 diff --git a/controller/test/terraform/.docker/cert.pem b/controller/test/terraform/.docker/cert.pem old mode 100644 new mode 100755 diff --git a/controller/test/terraform/.docker/server-cert.pem b/controller/test/terraform/.docker/server-cert.pem old mode 100644 new mode 100755 diff --git a/controller/test/terraform/containers.tf b/controller/test/terraform/containers.tf old mode 100644 new mode 100755 diff --git a/controller/test/terraform/images.tf b/controller/test/terraform/images.tf old mode 100644 new mode 100755 diff --git a/controller/test/terraform/main.tf b/controller/test/terraform/main.tf old mode 100644 new mode 100755 diff --git a/controller/test/terraform/providers.tf b/controller/test/terraform/providers.tf old mode 100644 new mode 100755 diff --git a/controller/test/terraform/resources.tf b/controller/test/terraform/resources.tf old mode 100644 new mode 100755 diff --git a/controller/test/terraform/variables.tf b/controller/test/terraform/variables.tf old mode 100644 new mode 100755 diff --git a/controller/test/yang/test-module.go b/controller/test/yang/test-module.go old mode 100644 new mode 100755 diff --git a/controller/test/yang/test.yang b/controller/test/yang/test.yang old mode 100644 new mode 100755 diff --git a/controller/test/yang/yang.go b/controller/test/yang/yang.go old mode 100644 new mode 100755 diff --git a/controller/topology/links/link.go b/controller/topology/links/link.go old mode 100644 new mode 100755 diff --git a/controller/topology/nodes/databaseNodeStore.go b/controller/topology/nodes/databaseNodeStore.go old mode 100644 new mode 100755 diff --git a/controller/topology/nodes/node.go b/controller/topology/nodes/node.go old mode 100644 new mode 100755 diff --git a/controller/topology/nodes/nodeService.go b/controller/topology/nodes/nodeService.go old mode 100644 new mode 100755 diff --git a/controller/topology/nodes/nodeService_test.go b/controller/topology/nodes/nodeService_test.go old mode 100644 new mode 100755 diff --git a/controller/topology/nodes/store.go b/controller/topology/nodes/store.go old mode 100644 new mode 100755 diff --git a/controller/topology/ports/configuration/configuration.go b/controller/topology/ports/configuration/configuration.go old mode 100644 new mode 100755 diff --git a/controller/topology/ports/port.go b/controller/topology/ports/port.go old mode 100644 new mode 100755 diff --git a/controller/topology/ports/portService.go b/controller/topology/ports/portService.go old mode 100644 new mode 100755 diff --git a/controller/topology/ports/portService_test.go b/controller/topology/ports/portService_test.go old mode 100644 new mode 100755 diff --git a/controller/topology/ports/portStore.go b/controller/topology/ports/portStore.go old mode 100644 new mode 100755 diff --git a/controller/topology/ports/store.go b/controller/topology/ports/store.go old mode 100644 new mode 100755 diff --git a/controller/topology/routing-tables/route.go b/controller/topology/routing-tables/route.go old mode 100644 new mode 100755 diff --git a/controller/topology/routing-tables/routingTable.go b/controller/topology/routing-tables/routingTable.go old mode 100644 new mode 100755 diff --git a/controller/topology/routing-tables/routingTableService.go b/controller/topology/routing-tables/routingTableService.go old mode 100644 new mode 100755 diff --git a/controller/topology/routing-tables/routingTableService_test.go b/controller/topology/routing-tables/routingTableService_test.go old mode 100644 new mode 100755 diff --git a/controller/topology/routing-tables/routingTableStore.go b/controller/topology/routing-tables/routingTableStore.go old mode 100644 new mode 100755 diff --git a/controller/topology/routing-tables/store.go b/controller/topology/routing-tables/store.go old mode 100644 new mode 100755 diff --git a/controller/topology/store.go b/controller/topology/store.go old mode 100644 new mode 100755 diff --git a/controller/topology/store/genericStore.go b/controller/topology/store/genericStore.go old mode 100644 new mode 100755 diff --git a/controller/topology/store/genericStore_test.go b/controller/topology/store/genericStore_test.go old mode 100644 new mode 100755 diff --git a/controller/topology/store/query.go b/controller/topology/store/query.go old mode 100644 new mode 100755 diff --git a/controller/topology/topology.go b/controller/topology/topology.go old mode 100644 new mode 100755 diff --git a/controller/topology/topologyService.go b/controller/topology/topologyService.go old mode 100644 new mode 100755 diff --git a/controller/topology/topologyService_test.go b/controller/topology/topologyService_test.go old mode 100644 new mode 100755 diff --git a/controller/topology/topologyStore.go b/controller/topology/topologyStore.go old mode 100644 new mode 100755 diff --git a/controller/version/version.go b/controller/version/version.go old mode 100644 new mode 100755 diff --git a/controller/version/version_test.go b/controller/version/version_test.go old mode 100644 new mode 100755 diff --git a/csbi/.csbi.yaml b/csbi/.csbi.yaml old mode 100644 new mode 100755 diff --git a/csbi/Dockerfile.exec b/csbi/Dockerfile.exec old mode 100644 new mode 100755 diff --git a/csbi/LICENSE b/csbi/LICENSE old mode 100644 new mode 100755 diff --git a/csbi/README.md b/csbi/README.md old mode 100644 new mode 100755 diff --git a/csbi/arista.capabilities b/csbi/arista.capabilities old mode 100644 new mode 100755 diff --git a/csbi/build.go b/csbi/build.go old mode 100644 new mode 100755 diff --git a/csbi/build/ci/.build-container.yml b/csbi/build/ci/.build-container.yml old mode 100644 new mode 100755 diff --git a/csbi/build/ci/.code-quality-ci.yml b/csbi/build/ci/.code-quality-ci.yml old mode 100644 new mode 100755 diff --git a/csbi/build/ci/.golangci-config/.golangci.yml b/csbi/build/ci/.golangci-config/.golangci.yml old mode 100644 new mode 100755 diff --git a/csbi/build/ci/.security-and-compliance-ci.yml b/csbi/build/ci/.security-and-compliance-ci.yml old mode 100644 new mode 100755 diff --git a/csbi/build/ci/.test.yml b/csbi/build/ci/.test.yml old mode 100644 new mode 100755 diff --git a/csbi/build_test.go b/csbi/build_test.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/csbi/main.go b/csbi/cmd/csbi/main.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/debug/main.go b/csbi/cmd/debug/main.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/demo/main.go b/csbi/cmd/demo/main.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/deploy.go b/csbi/cmd/deploy.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/discover.go b/csbi/cmd/discover.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/executor/executor.go b/csbi/cmd/executor/executor.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/executor/experiment.yaml b/csbi/cmd/executor/experiment.yaml old mode 100644 new mode 100755 diff --git a/csbi/cmd/generate.go b/csbi/cmd/generate.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/hello.go b/csbi/cmd/hello.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/init.go b/csbi/cmd/init.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/repository.go b/csbi/cmd/repository.go old mode 100644 new mode 100755 diff --git a/csbi/cmd/root.go b/csbi/cmd/root.go old mode 100644 new mode 100755 diff --git a/csbi/config/config.go b/csbi/config/config.go old mode 100644 new mode 100755 diff --git a/csbi/csbi.Dockerfile b/csbi/csbi.Dockerfile old mode 100644 new mode 100755 diff --git a/csbi/csbi.Dockerfile.dockerignore b/csbi/csbi.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/csbi/deployment.go b/csbi/deployment.go old mode 100644 new mode 100755 diff --git a/csbi/deployment_test.go b/csbi/deployment_test.go old mode 100644 new mode 100755 diff --git a/csbi/discover.go b/csbi/discover.go old mode 100644 new mode 100755 diff --git a/csbi/discover_test.go b/csbi/discover_test.go old mode 100644 new mode 100755 diff --git a/csbi/docker-compose.yml b/csbi/docker-compose.yml old mode 100644 new mode 100755 diff --git a/csbi/generate.go b/csbi/generate.go old mode 100644 new mode 100755 diff --git a/csbi/generate_test.go b/csbi/generate_test.go old mode 100644 new mode 100755 diff --git a/csbi/gnmi-target/gnmitarget.Dockerfile b/csbi/gnmi-target/gnmitarget.Dockerfile old mode 100644 new mode 100755 diff --git a/csbi/gnmi-target/gnmitarget.Dockerfile.dockerignore b/csbi/gnmi-target/gnmitarget.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/csbi/grafana/provisioning/datasources/prometheus_ds.yml b/csbi/grafana/provisioning/datasources/prometheus_ds.yml old mode 100644 new mode 100755 diff --git a/csbi/grpc.go b/csbi/grpc.go old mode 100644 new mode 100755 diff --git a/csbi/grpc_test.go b/csbi/grpc_test.go old mode 100644 new mode 100755 diff --git a/csbi/http.go b/csbi/http.go old mode 100644 new mode 100755 diff --git a/csbi/http_test.go b/csbi/http_test.go old mode 100644 new mode 100755 diff --git a/csbi/metrics.go b/csbi/metrics.go old mode 100644 new mode 100755 diff --git a/csbi/model.go b/csbi/model.go old mode 100644 new mode 100755 diff --git a/csbi/orchestrator.go b/csbi/orchestrator.go old mode 100644 new mode 100755 diff --git a/csbi/orchestrator_test.go b/csbi/orchestrator_test.go old mode 100644 new mode 100755 diff --git a/csbi/prometheus/alerts.yml b/csbi/prometheus/alerts.yml old mode 100644 new mode 100755 diff --git a/csbi/prometheus/prometheus.yml b/csbi/prometheus/prometheus.yml old mode 100644 new mode 100755 diff --git a/csbi/report.xml b/csbi/report.xml old mode 100644 new mode 100755 diff --git a/csbi/repository.go b/csbi/repository.go old mode 100644 new mode 100755 diff --git a/csbi/repository_test.go b/csbi/repository_test.go old mode 100644 new mode 100755 diff --git a/csbi/resources/Dockerfile b/csbi/resources/Dockerfile old mode 100644 new mode 100755 diff --git a/csbi/resources/config.yaml b/csbi/resources/config.yaml old mode 100644 new mode 100755 diff --git a/csbi/resources/csbi.go b/csbi/resources/csbi.go old mode 100644 new mode 100755 diff --git a/csbi/resources/csbiAdditions.go b/csbi/resources/csbiAdditions.go old mode 100644 new mode 100755 diff --git a/csbi/resources/go.mod b/csbi/resources/go.mod old mode 100644 new mode 100755 diff --git a/csbi/resources/go.sum b/csbi/resources/go.sum old mode 100644 new mode 100755 diff --git a/csbi/resources/gostructs.go b/csbi/resources/gostructs.go old mode 100644 new mode 100755 diff --git a/csbi/run.go b/csbi/run.go old mode 100644 new mode 100755 diff --git a/csbi/run_test.go b/csbi/run_test.go old mode 100644 new mode 100755 diff --git a/csbi/templates.go b/csbi/templates.go old mode 100644 new mode 100755 diff --git a/csbi/test.clab.yml b/csbi/test.clab.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/00000000-0000-0000-0000-000000000000/gostructs.go b/csbi/testdata/00000000-0000-0000-0000-000000000000/gostructs.go old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/arista-cli.yang b/csbi/testdata/models/experimental/eos/models/arista-cli.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/arista-eos-types.yang b/csbi/testdata/models/experimental/eos/models/arista-eos-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/arista-exp-eos.yang b/csbi/testdata/models/experimental/eos/models/arista-exp-eos.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/cert/arista-gnoi-cert.yang b/csbi/testdata/models/experimental/eos/models/cert/arista-gnoi-cert.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/evpn/arista-exp-eos-evpn.yang b/csbi/testdata/models/experimental/eos/models/evpn/arista-exp-eos-evpn.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/igmpsnooping/arista-exp-eos-igmpsnooping.yang b/csbi/testdata/models/experimental/eos/models/igmpsnooping/arista-exp-eos-igmpsnooping.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/l2protocolforwarding/arista-exp-eos-l2protocolforwarding.yang b/csbi/testdata/models/experimental/eos/models/l2protocolforwarding/arista-exp-eos-l2protocolforwarding.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/mlag/arista-exp-eos-mlag.yang b/csbi/testdata/models/experimental/eos/models/mlag/arista-exp-eos-mlag.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/multicast/arista-exp-eos-multicast.yang b/csbi/testdata/models/experimental/eos/models/multicast/arista-exp-eos-multicast.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/openconfig-component-counters.yang b/csbi/testdata/models/experimental/eos/models/openconfig-component-counters.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-acl-config.yang b/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-acl-config.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-config.yang b/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-config.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos.yang b/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/rpc/arista-rpc-netconf.yang b/csbi/testdata/models/experimental/eos/models/rpc/arista-rpc-netconf.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-intf.yang b/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-intf.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-net-inst.yang b/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-net-inst.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/vlan/vlan-translation.yang b/csbi/testdata/models/experimental/eos/models/vlan/vlan-translation.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan-config.yang b/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan-config.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan.yang b/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/LICENSE b/csbi/testdata/models/openconfig/hercules/LICENSE old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-interfaces.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-interfaces.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-chassis.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-chassis.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-linecard.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-linecard.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-node.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-node.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-port.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-port.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-qos.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-qos.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/LICENSE b/csbi/testdata/models/openconfig/public/LICENSE old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/README.md b/csbi/testdata/models/openconfig/public/release/README.md old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/acl/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-acl.yang b/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-acl.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match-types.yang b/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match.yang b/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/aft/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-common.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-common.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ethernet.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ethernet.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv4.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv4.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv6.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv6.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-mpls.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-mpls.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-network-instance.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-network-instance.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-pf.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-pf.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-types.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bfd/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/bfd/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bfd/openconfig-bfd.yang b/csbi/testdata/models/openconfig/public/release/models/bfd/openconfig-bfd.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/bgp/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-multiprotocol.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-multiprotocol.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-structure.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-structure.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-errors.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-errors.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-global.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-global.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-neighbor.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-neighbor.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-peer-group.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-peer-group.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-policy.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-policy.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-types.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/catalog/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/catalog/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-catalog-types.yang b/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-catalog-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-module-catalog.yang b/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-module-catalog.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/firewall/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/firewall/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-high-availability.yang b/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-high-availability.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-link-monitoring.yang b/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-link-monitoring.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/interfaces/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-8021x.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-8021x.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-aggregate.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-aggregate.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet-ext.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet-ext.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip-ext.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip-ext.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-poe.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-poe.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-sdn-ext.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-sdn-ext.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-tunnel.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-tunnel.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-types.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-interfaces.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/isis/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsdb-types.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsdb-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsp.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-policy.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-policy.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-routing.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-routing.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-types.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/lacp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/lacp/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/lacp/openconfig-lacp.yang b/csbi/testdata/models/openconfig/public/release/models/lacp/openconfig-lacp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/lldp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/lldp/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp-types.yang b/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp.yang b/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/local-routing/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/local-routing/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/local-routing/openconfig-local-routing.yang b/csbi/testdata/models/openconfig/public/release/models/local-routing/openconfig-local-routing.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/macsec/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/macsec/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec-types.yang b/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec.yang b/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/mpls/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-igp.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-igp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-ldp.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-ldp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-rsvp.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-rsvp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-sr.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-sr.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-static.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-static.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-te.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-te.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-types.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/multicast/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp-types.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim-types.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/network-instance/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l2.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l2.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l3.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l3.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-policy.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-policy.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-types.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/openconfig-extensions.yang b/csbi/testdata/models/openconfig/public/release/models/openconfig-extensions.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/openflow/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/openflow/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow-types.yang b/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow.yang b/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/optical-transport/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-channel-monitor.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-channel-monitor.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-amplifier.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-amplifier.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-attenuator.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-attenuator.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-terminal-device.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-terminal-device.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-common.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-common.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-connectivity.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-connectivity.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-protection.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-protection.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-types.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-wavelength-router.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-wavelength-router.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/ospf/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-policy.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-policy.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-types.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area-interface.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area-interface.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-common.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-common.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-global.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-global.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-lsdb.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-lsdb.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/p4rt/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/p4rt/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/p4rt/openconfig-p4rt.yang b/csbi/testdata/models/openconfig/public/release/models/p4rt/openconfig-p4rt.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/platform/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-cpu.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-cpu.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-ext.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-ext.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-fan.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-fan.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-linecard.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-linecard.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-pipeline-counters.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-pipeline-counters.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-port.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-port.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-psu.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-psu.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-software.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-software.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-transceiver.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-transceiver.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-types.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-forwarding-policies.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-forwarding-policies.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-interfaces.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-path-groups.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-path-groups.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-srte.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-srte.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-policy-forwarding.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-policy-forwarding.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/policy/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-policy-types.yang b/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-policy-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-routing-policy.yang b/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-routing-policy.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/probes/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/probes/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes-types.yang b/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes.yang b/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/qos/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-elements.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-elements.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-interfaces.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-types.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/relay-agent/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/relay-agent/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/relay-agent/openconfig-relay-agent.yang b/csbi/testdata/models/openconfig/public/release/models/relay-agent/openconfig-relay-agent.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/rib/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-attributes.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-attributes.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-ext.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-ext.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-shared-attributes.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-shared-attributes.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-table-attributes.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-table-attributes.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-tables.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-tables.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-types.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/sampling/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/sampling/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/sampling/openconfig-sampling-sflow.yang b/csbi/testdata/models/openconfig/public/release/models/sampling/openconfig-sampling-sflow.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/segment-routing/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-rsvp-sr-ext.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-rsvp-sr-ext.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing-types.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-srte-policy.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-srte-policy.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/stp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/stp/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree-types.yang b/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree.yang b/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/system/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-radius.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-radius.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-tacacs.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-tacacs.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-types.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarm-types.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarm-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarms.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarms.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-license.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-license.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-messages.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-messages.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-procmon.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-procmon.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-logging.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-logging.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-management.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-management.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-terminal.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-terminal.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/telemetry/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/telemetry/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry-types.yang b/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry.yang b/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/types/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/openconfig-inet-types.yang b/csbi/testdata/models/openconfig/public/release/models/types/openconfig-inet-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/openconfig-types.yang b/csbi/testdata/models/openconfig/public/release/models/types/openconfig-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/openconfig-yang-types.yang b/csbi/testdata/models/openconfig/public/release/models/types/openconfig-yang-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/vlan/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/vlan/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan-types.yang b/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan.yang b/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/wifi/.spec.yml old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/README.md b/csbi/testdata/models/openconfig/public/release/models/wifi/README.md old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-access-points.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-access-points.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-interfaces.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-manager.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-manager.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-mac.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-mac.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-phy.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-phy.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-types.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/acl/arista-acl-deviations.yang b/csbi/testdata/models/release/openconfig/models/acl/arista-acl-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/aft/arista-aft-augments.yang b/csbi/testdata/models/release/openconfig/models/aft/arista-aft-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-augments.yang b/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-deviations.yang b/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-augments.yang b/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-deviations.yang b/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-augments.yang b/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-deviations.yang b/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/isis/arista-isis-augments.yang b/csbi/testdata/models/release/openconfig/models/isis/arista-isis-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/isis/arista-isis-deviations.yang b/csbi/testdata/models/release/openconfig/models/isis/arista-isis-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-augments.yang b/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-deviations.yang b/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-augments.yang b/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-deviations.yang b/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/local-routing/arista-local-routing-deviations.yang b/csbi/testdata/models/release/openconfig/models/local-routing/arista-local-routing-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-augments.yang b/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-deviations.yang b/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/multicast/arista-pim-augments.yang b/csbi/testdata/models/release/openconfig/models/multicast/arista-pim-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/network-instance/arista-netinst-deviations.yang b/csbi/testdata/models/release/openconfig/models/network-instance/arista-netinst-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-augments.yang b/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-deviations.yang b/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-acl-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-acl-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-bfd-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-bfd-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-bgp-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-bgp-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-interfaces-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-interfaces-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-lacp-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-lacp-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-lldp-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-lldp-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-local-routing-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-local-routing-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-messages-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-messages-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-network-instance-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-network-instance-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-platform-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-platform-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-qos-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-qos-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-routing-policy-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-routing-policy-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-system-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-system-notsupported-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/openflow/arista-openflow-deviations.yang b/csbi/testdata/models/release/openconfig/models/openflow/arista-openflow-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-augments.yang b/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-deviations.yang b/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-augments.yang b/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-deviations.yang b/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/qos/arista-qos-augments.yang b/csbi/testdata/models/release/openconfig/models/qos/arista-qos-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/relay-agent/arista-relay-agent-deviations.yang b/csbi/testdata/models/release/openconfig/models/relay-agent/arista-relay-agent-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/system/arista-system-augments.yang b/csbi/testdata/models/release/openconfig/models/system/arista-system-augments.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/release/openconfig/models/system/arista-system-deviations.yang b/csbi/testdata/models/release/openconfig/models/system/arista-system-deviations.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/third_party/README.md b/csbi/testdata/models/third_party/README.md old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/third_party/ietf/iana-if-type.yang b/csbi/testdata/models/third_party/ietf/iana-if-type.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/third_party/ietf/ietf-inet-types.yang b/csbi/testdata/models/third_party/ietf/ietf-inet-types.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/third_party/ietf/ietf-interfaces.yang b/csbi/testdata/models/third_party/ietf/ietf-interfaces.yang old mode 100644 new mode 100755 diff --git a/csbi/testdata/models/third_party/ietf/ietf-yang-types.yang b/csbi/testdata/models/third_party/ietf/ietf-yang-types.yang old mode 100644 new mode 100755 diff --git a/csbi/write.go b/csbi/write.go old mode 100644 new mode 100755 diff --git a/csbi/write_test.go b/csbi/write_test.go old mode 100644 new mode 100755 diff --git a/dev_env_data/clab/basic_one_arista.yaml b/dev_env_data/clab/basic_one_arista.yaml old mode 100644 new mode 100755 diff --git a/dev_env_data/clab/basic_two_aristas.yaml b/dev_env_data/clab/basic_two_aristas.yaml old mode 100644 new mode 100755 diff --git a/dev_env_data/clab/basic_two_gnmi_targets.yaml b/dev_env_data/clab/basic_two_gnmi_targets.yaml old mode 100644 new mode 100755 diff --git a/dev_env_data/clab/demo.clab.yaml b/dev_env_data/clab/demo.clab.yaml old mode 100644 new mode 100755 diff --git a/dev_env_data/clab/gosdn.clab.yaml b/dev_env_data/clab/gosdn.clab.yaml old mode 100644 new mode 100755 diff --git a/dev_env_data/clab/gosdn_slim.clab.yaml b/dev_env_data/clab/gosdn_slim.clab.yaml old mode 100644 new mode 100755 diff --git a/dev_env_data/docker-compose/basic_docker-compose.yml b/dev_env_data/docker-compose/basic_docker-compose.yml old mode 100644 new mode 100755 diff --git a/dev_env_data/docker-compose/integration-test_docker-compose.yml b/dev_env_data/docker-compose/integration-test_docker-compose.yml old mode 100644 new mode 100755 diff --git a/dev_env_data/plugin-registry/plugin-store.json b/dev_env_data/plugin-registry/plugin-store.json old mode 100644 new mode 100755 diff --git a/dev_env_data/sdn/basic_two_aristas.json b/dev_env_data/sdn/basic_two_aristas.json old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml old mode 100644 new mode 100755 diff --git a/docker_volume_backup/.gitkeep b/docker_volume_backup/.gitkeep old mode 100644 new mode 100755 diff --git a/docs/images/logo.png b/docs/images/logo.png old mode 100644 new mode 100755 diff --git a/docs/images/logo.svg b/docs/images/logo.svg old mode 100644 new mode 100755 diff --git a/docs/index.md b/docs/index.md old mode 100644 new mode 100755 diff --git a/documentation/README.md b/documentation/README.md old mode 100644 new mode 100755 diff --git a/documentation/SUMMARY.md b/documentation/SUMMARY.md old mode 100644 new mode 100755 diff --git a/documentation/figures/.gitkeep b/documentation/figures/.gitkeep old mode 100644 new mode 100755 diff --git a/documentation/figures/nucleus/.gitkeep b/documentation/figures/nucleus/.gitkeep old mode 100644 new mode 100755 diff --git a/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio b/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio old mode 100644 new mode 100755 diff --git a/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio.png b/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio.png old mode 100644 new mode 100755 diff --git a/documentation/figures/overview/.gitkeep b/documentation/figures/overview/.gitkeep old mode 100644 new mode 100755 diff --git a/documentation/figures/overview/updated_controller_architecture_overview.drawio b/documentation/figures/overview/updated_controller_architecture_overview.drawio old mode 100644 new mode 100755 diff --git a/documentation/figures/overview/updated_controller_architecture_overview.drawio.png b/documentation/figures/overview/updated_controller_architecture_overview.drawio.png old mode 100644 new mode 100755 diff --git a/documentation/figures/plugins/.gitkeep b/documentation/figures/plugins/.gitkeep old mode 100644 new mode 100755 diff --git a/documentation/figures/plugins/plugin-device-interaction.drawio b/documentation/figures/plugins/plugin-device-interaction.drawio old mode 100644 new mode 100755 diff --git a/documentation/figures/plugins/plugin-device-interaction.drawio.png b/documentation/figures/plugins/plugin-device-interaction.drawio.png old mode 100644 new mode 100755 diff --git a/forks/LICENSE b/forks/LICENSE old mode 100644 new mode 100755 diff --git a/forks/README.md b/forks/README.md old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/arbitration.go b/forks/goarista/gnmi/arbitration.go old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/arbitration_test.go b/forks/goarista/gnmi/arbitration_test.go old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/client.go b/forks/goarista/gnmi/client.go old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/json.go b/forks/goarista/gnmi/json.go old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/operation.go b/forks/goarista/gnmi/operation.go old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/operation_test.go b/forks/goarista/gnmi/operation_test.go old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/path.go b/forks/goarista/gnmi/path.go old mode 100644 new mode 100755 diff --git a/forks/goarista/gnmi/path_test.go b/forks/goarista/gnmi/path_test.go old mode 100644 new mode 100755 diff --git a/forks/google/README.md b/forks/google/README.md old mode 100644 new mode 100755 diff --git a/forks/google/gnmi/model.go b/forks/google/gnmi/model.go old mode 100644 new mode 100755 diff --git a/forks/google/gnmi/modeldata/gostruct/gen.go b/forks/google/gnmi/modeldata/gostruct/gen.go old mode 100644 new mode 100755 diff --git a/forks/google/gnmi/modeldata/gostruct/generated.go.wasd b/forks/google/gnmi/modeldata/gostruct/generated.go.wasd old mode 100644 new mode 100755 diff --git a/forks/google/gnmi/modeldata/modeldata.go b/forks/google/gnmi/modeldata/modeldata.go old mode 100644 new mode 100755 diff --git a/forks/google/gnmi/server.go b/forks/google/gnmi/server.go old mode 100644 new mode 100755 diff --git a/forks/google/gnmi/server_test.go.wasd b/forks/google/gnmi/server_test.go.wasd old mode 100644 new mode 100755 diff --git a/forks/google/gnmi/util.go b/forks/google/gnmi/util.go old mode 100644 new mode 100755 diff --git a/go.mod b/go.mod old mode 100644 new mode 100755 diff --git a/go.sum b/go.sum old mode 100644 new mode 100755 diff --git a/gosdn-cli-showcase.webm b/gosdn-cli-showcase.webm old mode 100644 new mode 100755 diff --git a/integration-tests/application_tests/appUtility_test.go b/integration-tests/application_tests/appUtility_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/application_tests/application_test.go b/integration-tests/application_tests/application_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/application_tests/eventAssertion_test.go b/integration-tests/application_tests/eventAssertion_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/example_tests/example_test.go b/integration-tests/example_tests/example_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/integrationTestUtils/integrationTestUtils.go b/integration-tests/integrationTestUtils/integrationTestUtils.go old mode 100644 new mode 100755 diff --git a/integration-tests/lab_tests/lab00_test.go b/integration-tests/lab_tests/lab00_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/lab_tests/labUtility_test.go b/integration-tests/lab_tests/labUtility_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/networkElement_tests/modelUtility_test.go b/integration-tests/networkElement_tests/modelUtility_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/networkElement_tests/networkElement_test.go b/integration-tests/networkElement_tests/networkElement_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/rbac_tests/rbac_test.go b/integration-tests/rbac_tests/rbac_test.go old mode 100644 new mode 100755 diff --git a/integration-tests/topology_tests/topology_test.go b/integration-tests/topology_tests/topology_test.go old mode 100644 new mode 100755 diff --git a/lab-vm/README.md b/lab-vm/README.md old mode 100644 new mode 100755 diff --git a/lab-vm/vm-with-packer/gosdn_vm.pkr.hcl b/lab-vm/vm-with-packer/gosdn_vm.pkr.hcl old mode 100644 new mode 100755 diff --git a/lab-vm/vm-with-packer/http/meta-data b/lab-vm/vm-with-packer/http/meta-data old mode 100644 new mode 100755 diff --git a/lab-vm/vm-with-packer/http/user-data b/lab-vm/vm-with-packer/http/user-data old mode 100644 new mode 100755 diff --git a/lab-vm/vm-with-packer/scripts/gosdn_clone.sh b/lab-vm/vm-with-packer/scripts/gosdn_clone.sh old mode 100644 new mode 100755 diff --git a/lab-vm/vm-with-packer/scripts/setup.sh b/lab-vm/vm-with-packer/scripts/setup.sh old mode 100644 new mode 100755 diff --git a/lab-vm/vm-with-vagrant/Vagrantfile b/lab-vm/vm-with-vagrant/Vagrantfile old mode 100644 new mode 100755 diff --git a/makefiles/build/Makefile b/makefiles/build/Makefile old mode 100644 new mode 100755 diff --git a/makefiles/ci/Makefile b/makefiles/ci/Makefile old mode 100644 new mode 100755 diff --git a/makefiles/clab/Makefile b/makefiles/clab/Makefile old mode 100644 new mode 100755 diff --git a/makefiles/container/Makefile b/makefiles/container/Makefile old mode 100644 new mode 100755 diff --git a/makefiles/generate/Makefile b/makefiles/generate/Makefile old mode 100644 new mode 100755 diff --git a/mkdocs.yml b/mkdocs.yml old mode 100644 new mode 100755 diff --git a/models/generated/README.md b/models/generated/README.md old mode 100644 new mode 100755 diff --git a/models/generated/arista/additions.patch b/models/generated/arista/additions.patch old mode 100644 new mode 100755 diff --git a/models/generated/arista/arista.go b/models/generated/arista/arista.go old mode 100644 new mode 100755 diff --git a/models/generated/arista/config.yaml b/models/generated/arista/config.yaml old mode 100644 new mode 100755 diff --git a/models/generated/arista/yang.go b/models/generated/arista/yang.go old mode 100644 new mode 100755 diff --git a/models/generated/openconfig/additions.patch b/models/generated/openconfig/additions.patch old mode 100644 new mode 100755 diff --git a/models/generated/openconfig/config.yaml b/models/generated/openconfig/config.yaml old mode 100644 new mode 100755 diff --git a/models/generated/openconfig/openconfig.go b/models/generated/openconfig/openconfig.go old mode 100644 new mode 100755 diff --git a/models/generated/openconfig/yang.go b/models/generated/openconfig/yang.go old mode 100644 new mode 100755 diff --git a/plugin-registry/README.md b/plugin-registry/README.md old mode 100644 new mode 100755 diff --git a/plugin-registry/main.go b/plugin-registry/main.go old mode 100644 new mode 100755 diff --git a/plugin-registry/plugin-registry.Dockerfile b/plugin-registry/plugin-registry.Dockerfile old mode 100644 new mode 100755 diff --git a/plugin-registry/plugin-registry.Dockerfile.dockerignore b/plugin-registry/plugin-registry.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/plugin-registry/plugin-registry.debug.Dockerfile b/plugin-registry/plugin-registry.debug.Dockerfile old mode 100644 new mode 100755 diff --git a/plugin-registry/plugin-registry.debug.Dockerfile.dockerignore b/plugin-registry/plugin-registry.debug.Dockerfile.dockerignore old mode 100644 new mode 100755 diff --git a/plugin-registry/registry.go b/plugin-registry/registry.go old mode 100644 new mode 100755 diff --git a/plugin-registry/server.go b/plugin-registry/server.go old mode 100644 new mode 100755 diff --git a/plugin-registry/store.go b/plugin-registry/store.go old mode 100644 new mode 100755 diff --git a/plugins/README.md b/plugins/README.md old mode 100644 new mode 100755 diff --git a/plugins/examples/arista/cmd/main.go b/plugins/examples/arista/cmd/main.go old mode 100644 new mode 100755 diff --git a/plugins/examples/arista/plugin.yaml b/plugins/examples/arista/plugin.yaml old mode 100644 new mode 100755 diff --git a/plugins/examples/openconfig/cmd/main.go b/plugins/examples/openconfig/cmd/main.go old mode 100644 new mode 100755 diff --git a/plugins/examples/openconfig/plugin.yaml b/plugins/examples/openconfig/plugin.yaml old mode 100644 new mode 100755 diff --git a/plugins/sdk/deviceModel.go b/plugins/sdk/deviceModel.go old mode 100644 new mode 100755 diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index f211fe024..c7538079a 100755 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -3,7 +3,6 @@ import { NetworkelementManagedNetworkElement, PndPrincipalNetworkDomain } from '@api/api' -import { DeviceViewTabValues } from '@component/devices/view/device.view.tabs' import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { refreshUpdateTimer } from '@shared/reducer/routine.reducer' import { Category, CategoryType } from '@shared/types/category.type' @@ -24,14 +23,12 @@ export interface DeviceSliceState { devices: Device[] pnds: PndPrincipalNetworkDomain[] - activeTab: DeviceViewTabValues selected: SelectedObject | null } const initialState: DeviceSliceState = { devices: [], pnds: [], - activeTab: DeviceViewTabValues.METADATA, selected: null, } @@ -52,9 +49,6 @@ const deviceSlice = createSlice({ setPnds: (state, action: PayloadAction<PndPrincipalNetworkDomain[] | undefined>) => { state.pnds = action.payload || [] }, - setActiveTab: (state, action: PayloadAction<DeviceViewTabValues>) => { - state.activeTab = action.payload - }, setSelectedDevice: { reducer: (state, { payload, meta }: PayloadAction<SetSelectedDeviceType, string, { skipListener?: boolean }>) => { /** @@ -110,7 +104,7 @@ const deviceSlice = createSlice({ }, }) -export const { setDevices, setActiveTab, setSelectedDevice, setSelectedMne, setSelectedJson, setPnds } = +export const { setDevices, setSelectedDevice, setSelectedMne, setSelectedJson, setPnds } = deviceSlice.actions export default deviceSlice.reducer diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index 1f7221ead..f1eb53130 100755 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -1,71 +1,97 @@ +import { faChevronDown } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { insertMarkTags } from "@helper/text"; import { useAppSelector } from "@hooks"; import DOMPurify from 'dompurify'; -import { MutableRefObject, useCallback, useRef } from "react"; -import { OverlayTrigger, Table, Tooltip } from "react-bootstrap"; +import { RefObject, useCallback, useRef, useState } from 'react'; +import { Collapse, OverlayTrigger, Tooltip } from 'react-bootstrap'; import { useTranslation } from "react-i18next"; +import { Device } from "../reducer/device.reducer"; import { useDeviceTableViewModel } from "../view_model/device.table.viewmodel"; +import { DeviceListCollapsable } from "./subcomponent/device.view.list-detail"; const cropUUID = (uuid: string): string => { return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); -} +}; -export const DeviceViewTable = (searchRef: MutableRefObject<HTMLInputElement>) => { +export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElement> }) => { const { devices, pnds, selected: selectedDevice } = useAppSelector(state => state.device); const { t } = useTranslation('common'); - const tableRef = useRef(); - const { trClickHandler } = useDeviceTableViewModel(searchRef, tableRef); + const [expandedId, setExpandedId] = useState<string | null | undefined>(null); + const listRef = useRef<HTMLDivElement>(null); + const { dispatchDevice } = useDeviceTableViewModel(searchRef, listRef); - const getDeviceTable = useCallback(() => { - const search = searchRef.current?.value; - let filtered = devices + const handleItemClick = useCallback((device: Device) => { + dispatchDevice(device) + + const { id } = device + setExpandedId(expandedId === id ? null : id); + }, [expandedId]); + + const getDeviceList = useCallback(() => { + const search = searchRef?.current?.value; + let filtered = devices; - // filter if something is in search if (search) { filtered = devices.filter((device) => { const user = pnds.find(pnd => pnd.id === device.pid); - return device.id?.includes(search) || device.name?.includes(search) || user?.name?.includes(search); - }) + }); } - return filtered.map((device, index) => { + return filtered.map((device) => { const user = pnds.find(pnd => pnd.id === device.pid); - - const username = user?.name || '' + const username = user?.name || ''; const deviceId = device.id!; - const cropedId = cropUUID(deviceId) + const croppedId = cropUUID(deviceId); const devicename = device.name || ''; - - const rowData = username + ";" + deviceId + ";" + devicename + const isExpanded = expandedId === deviceId; + const isSelected = selectedDevice?.device.id === deviceId; return ( - <tr data-copy-value={rowData} key={index} onClick={() => trClickHandler(device)} className={selectedDevice?.device.id === deviceId ? 'active' : ''}> - <td data-copy-value={devicename} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(devicename, search) : DOMPurify.sanitize(devicename) }}></td> - <OverlayTrigger overlay={<Tooltip id={device.id}>{deviceId}</Tooltip>}> - <td data-copy-value={deviceId} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(cropedId, search) : DOMPurify.sanitize(cropedId) }}></td> - </OverlayTrigger> - <td data-copy-value={username} dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) }}></td> - </tr> + <div + key={deviceId} + className={`border-bottom border-primary p-2 transition-bg ${isSelected && 'bg-gradient-fade'} ${!isSelected && 'text-disabled'}`} + > + <div + aria-expanded={isExpanded} + className="d-flex justify-content-between py-4 clickable" + onClick={() => handleItemClick(device)}> + <FontAwesomeIcon icon={faChevronDown} rotation={isExpanded ? undefined : 270} /> + <span dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(devicename, search) : DOMPurify.sanitize(devicename) + }} /> + <OverlayTrigger overlay={<Tooltip id={deviceId}>{deviceId}</Tooltip>}> + <span className="text-gray-500" dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(croppedId, search) : DOMPurify.sanitize(croppedId) + }} /> + </OverlayTrigger> + <span className="text-gray-500" dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) + }} /> + </div> - ) - }) - }, [devices, searchRef, pnds, selectedDevice, trClickHandler]); + <Collapse in={isExpanded}> + <div> + <DeviceListCollapsable deviceId={deviceId} username={username} search={search} /> + </div> + </Collapse> + </div> + ); + }); + }, [devices, searchRef, pnds, selectedDevice, expandedId, handleItemClick]); return ( - <Table striped responsive className="device-table" ref={tableRef}> - <thead> - <tr> - <th>{t('device.table.header.name')}</th> - <th>{t('device.table.header.uuid')}</th> - <th>{t('device.table.header.user')}</th> - </tr> - </thead> - <tbody> - {getDeviceTable()} - </tbody> - </Table> - ) -} \ No newline at end of file + <div className="rounded border border-primary mt-2"> + <div className="border-bottom border-primary d-flex justify-content-between px-4 py-2 clickable" onClick={() => handleItemClick(device)}> + <FontAwesomeIcon icon={faChevronDown} className="opacity-0" /> + <span className="font-medium">{t('device.table.header.name')}</span> + <span className="font-medium">{t('device.table.header.uuid')}</span> + <span className="font-medium">{t('device.table.header.user')}</span> + </div> + <div ref={listRef}>{getDeviceList()}</div> + </div> + ); +}; \ No newline at end of file diff --git a/react-ui/src/components/devices/view/device.view.tabs.tsx b/react-ui/src/components/devices/view/device.view.tabs.tsx deleted file mode 100755 index ef8ba120f..000000000 --- a/react-ui/src/components/devices/view/device.view.tabs.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useAppSelector } from "@hooks"; -import { JsonViewer } from "../../../shared/components/json_viewer/view/json_viewer.view"; -import { useDeviceTabsViewModel } from "../view_model/device.tabs.viewmodel"; - -export enum DeviceViewTabValues { - METADATA = 'metadata', - YANGMODEL = 'yang_model' -} - -export const DeviceViewTabs = (activeTab: DeviceViewTabValues) => { - const { selected: selectedDevice } = useAppSelector(state => state.device); - const { jsonYang } = useDeviceTabsViewModel(); - - const metadataTab = () => { - return ( - <div> - {selectedDevice!.mne!.name} - </div> - ) - } - - const yangModelTab = () => { - return ( - <> - {jsonYang && - <JsonViewer json={jsonYang} /> - } - </> - ); - } - - const renderLoading = () => { - return ( - <div> - Loading... - </div> - ) - } - - const renderNoDeviceSelected = () => { - - return ( - <div> - No device selected - </div> - ) - } - - - return ( - <> - {selectedDevice?.mne ? ( - <> - {activeTab === DeviceViewTabValues.METADATA && metadataTab()} - {activeTab === DeviceViewTabValues.YANGMODEL && yangModelTab()} - </> - ) : - selectedDevice ? renderLoading() : renderNoDeviceSelected() - } - - </> - ); -} diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 6bd702bf7..3e4b822d0 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,20 +1,20 @@ -import { faGripVertical } from '@fortawesome/free-solid-svg-icons'; +import { faGripVertical, faPlus } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { GridLayout } from '@layout/grid.layout/grid.layout'; import UpdateIndicator from '@layout/grid.layout/update-inidicator.layout/update-indicator.layout'; +import { JsonViewer } from '@shared/components/json_viewer/view/json_viewer.view'; import { Category, CategoryType } from '@shared/types/category.type'; import { useRef } from 'react'; -import { Button, Col, Container, Form, Nav, NavLink, Row } from 'react-bootstrap'; +import { Button, Col, Container, Form, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; import { useDeviceViewModel } from '../view_model/device.viewmodel'; import './device.scss'; -import { DeviceViewTable } from './device.view.table'; -import { DeviceViewTabValues, DeviceViewTabs } from './device.view.tabs'; +import { DeviceList } from './device.view.table'; const DeviceView = () => { const { t } = useTranslation('common'); const searchRef = useRef<HTMLInputElement>(null); - const { activeTab, setActiveTab, handleActiveTabLink } = useDeviceViewModel(); + const { jsonYang } = useDeviceViewModel(); return ( <div className='m-4 pt-4'> @@ -32,20 +32,20 @@ const DeviceView = () => { <h3 className='text-black-50'>{t('device.title')}</h3> </Col> </Row> - <Row className='align-items-center'> + <Row> <Col xs={12} sm={6}> <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> </Form.Group> </Col> - <Col xs={12} sm={6} className='pt-2'> - <Button variant='primary' className='w-100 my-auto'>{t('device.add_device_button')}</Button> + <Col xs={12} sm={{ span: 4, offset: 2 }} className='pt-2'> + <Button variant='primary' className='float-end'><FontAwesomeIcon icon={faPlus} className='me-1' />{t('device.add_device_button')}</Button> </Col> </Row> <Row className='align-items-start'> <Col sm={12} className='pt-2'> - {DeviceViewTable(searchRef)} + {DeviceList({ searchRef })} </Col> </Row> </Container> @@ -60,25 +60,14 @@ const DeviceView = () => { <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row> <Col xs={12} className='mt-4'> - <Nav className='justify-content-around'> - <NavLink - className={handleActiveTabLink(DeviceViewTabValues.METADATA) + " tab-links"} - onClick={() => setActiveTab(DeviceViewTabValues.METADATA)} - > - {t('device.tabs.metadata.title')} - </NavLink> - <NavLink - className={handleActiveTabLink(DeviceViewTabValues.YANGMODEL) + " tab-links"} - onClick={() => setActiveTab(DeviceViewTabValues.YANGMODEL)} - > - {t('device.tabs.yang_model.title')} - </NavLink> - </Nav> + {t('device.tabs.yang_model.title')} </Col> </Row> <Row className='align-items-start'> <Col xs={12}> - {DeviceViewTabs(activeTab)} + {jsonYang && + <JsonViewer json={jsonYang} /> + } </Col> </Row> </Container> diff --git a/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx b/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx new file mode 100644 index 000000000..6e904313d --- /dev/null +++ b/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx @@ -0,0 +1,72 @@ +import { faChevronDown, faHashtag, faUser } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { insertMarkTags } from "@helper/text"; +import { useAppSelector } from "@hooks"; +import { JsonViewer } from "@shared/components/json_viewer/view/json_viewer.view"; +import DOMPurify from 'dompurify'; +import { useCallback, useEffect, useState } from "react"; +import { Collapse } from "react-bootstrap"; + +interface DeviceListCollapsableProps { + deviceId: string + username: string + search?: string, +} + + +export const DeviceListCollapsable = ({ deviceId, username, search }: DeviceListCollapsableProps) => { + const { selected } = useAppSelector(state => state.device); + const [metadata, setMetadata] = useState<boolean>(false) + + + useEffect(() => { + if (!selected?.json) return; + }) + + + + const content = useCallback(() => { + if (!selected?.json) return; + + const key = Object.keys(selected.json).at(2) as keyof typeof selected.json + const metadataObject = selected.json[key] as JSON; + + return ( + <div id={`collapse-${deviceId}`}> + <div className="pb-4 pt-1 d-flex flex-column gap-1" > + <div className="d-flex justify-content-between"> + <div> + <FontAwesomeIcon className="me-2" icon={faHashtag} /> + UUID: + </div> + <span dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(deviceId, search) : DOMPurify.sanitize(deviceId) + }} /> + </div> + <div className="d-flex justify-content-between"> + <div> + <FontAwesomeIcon className="me-2" icon={faUser} /> + User: + </div> + <span>{username}</span> + </div> + + <div className="d-flex justify-content-between clickable border-top border-dark mt-3 pt-2" aria-expanded={metadata} onClick={() => setMetadata(!metadata)}> + <div> + <FontAwesomeIcon icon={faChevronDown} rotation={metadata ? undefined : 270} /> + Metadata: + </div> + </div> + + <Collapse in={metadata}> + <div id={`collapse-${deviceId}`}> + {JsonViewer({ json: metadataObject, options: { editable: false, searchEnabled: false } })} + </div> + </Collapse> + </div> + </div > + ) + }, [metadata]) + + return content() +} \ No newline at end of file diff --git a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts index 4b328d639..77ba8ddea 100755 --- a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.table.viewmodel.ts @@ -7,7 +7,7 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "react-toastify"; -export const useDeviceTableViewModel = (searchRef, tableRef) => { +export const useDeviceTableViewModel = (searchRef, listRef) => { const [searchTerm, setSearchTerm] = useState(''); const dispatch = useAppDispatch(); const { subscribe } = useMenu(); @@ -16,8 +16,8 @@ export const useDeviceTableViewModel = (searchRef, tableRef) => { const registerMenuOptions = () => { - const subscription = subscribe({ - target: tableRef.current, + const subscription = subscribe!({ + target: listRef.current, actions: [ { key: t('device.table.actions.copy'), @@ -61,9 +61,8 @@ export const useDeviceTableViewModel = (searchRef, tableRef) => { } } - // seperate use effect to rerun this after tableref and subscribe are initialized useEffect(() => { - if (!subscribe || !tableRef.current) { + if (!subscribe || !listRef?.current) { return } @@ -72,11 +71,11 @@ export const useDeviceTableViewModel = (searchRef, tableRef) => { return () => { unsubscribe() } - }, [tableRef, subscribe]) + }, [listRef, subscribe]) useEffect(() => { - if (!searchRef.current) { + if (!searchRef?.current) { return } @@ -93,13 +92,13 @@ export const useDeviceTableViewModel = (searchRef, tableRef) => { }; }, [searchRef]); - const trClickHandler = (device: Device) => { + const dispatchDevice = (device: Device) => { dispatch(setSelectedDevice({ device })); } return { searchTerm, - trClickHandler + dispatchDevice } } \ No newline at end of file diff --git a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts b/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts deleted file mode 100755 index af4cc3abb..000000000 --- a/react-ui/src/components/devices/view_model/device.tabs.viewmodel.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useAppSelector } from '@hooks' -import { useMemo } from 'react' - -export enum DeviceViewTabValues { - METADATA = 'metadata', - YANGMODEL = 'yang_model', -} - -export const useDeviceTabsViewModel = () => { - const { selected: selectedDevice } = useAppSelector((state) => state.device) - - const getYangModelJSON = (): JSON | null => { - if (!selectedDevice?.json) { - return null - } - - const key = Object.keys(selectedDevice.json).at(1) as keyof typeof selectedDevice.json - const innerJson = selectedDevice.json[key] - - if (!(innerJson instanceof Object)) { - return null - } - - return innerJson - } - - const jsonYang = useMemo<JSON | null>(getYangModelJSON, [selectedDevice]) - - return { - jsonYang, - } -} diff --git a/react-ui/src/components/devices/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts index 1cce2d59a..ba2ee88a9 100755 --- a/react-ui/src/components/devices/view_model/device.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.viewmodel.ts @@ -1,25 +1,27 @@ -import { setActiveTab as setActiveTabState } from '@component/devices/reducer/device.reducer' -import { useAppDispatch, useAppSelector } from '@hooks' -import { DeviceViewTabValues } from '@view/device/device.view.tabs' -import { useEffect } from 'react' +import { useAppSelector } from '@hooks' +import { useMemo } from 'react' export const useDeviceViewModel = () => { - const { activeTab } = useAppSelector((state) => state.device) - const dispatch = useAppDispatch() + const { selected: selectedDevice } = useAppSelector((state) => state.device) - useEffect(() => { }, []) + const getYangModelJSON = (): JSON | null => { + if (!selectedDevice?.json) { + return null + } - const handleActiveTabLink = (tabLink: DeviceViewTabValues) => { - return activeTab === tabLink ? 'active' : '' - } + const key = Object.keys(selectedDevice.json).at(1) as keyof typeof selectedDevice.json + const innerJson = selectedDevice.json[key] + + if (!(innerJson instanceof Object)) { + return null + } - const setActiveTab = (tab: DeviceViewTabValues) => { - dispatch(setActiveTabState(tab)) + return innerJson } + const jsonYang = useMemo<JSON | null>(getYangModelJSON, [selectedDevice]) + return { - activeTab, - setActiveTab, - handleActiveTabLink, + jsonYang } } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 3697efd07..0a8fbbf25 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -13,7 +13,6 @@ import { PersistGate } from 'redux-persist/integration/react' import './i18n/config' import './index.scss' import { router } from './routes' -import './shared/icons/icons' import { persistor, store } from './stores' window.env = window.location.hostname === 'localhost' ? 'development' : 'production'; diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss index 20befdcbb..8a9a78ae5 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss @@ -1,17 +1,11 @@ @import "/src/shared/style/colors.scss"; -.list-group-tr { - list-style-type: none; - margin: 0; - padding: 0 0; -} - .list-item-td { & > td { color: lighten(map-get($map: $theme-colors, $key: "black"), 20%) !important; - background-color: white !important; border: 0; padding: 0.2em 0 !important; + background-color: transparent !important; } & > td:nth-child(2) { diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index 33e52a397..da107ca93 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -9,10 +9,14 @@ import { useJsonViewer } from "../viewmodel/json_viewer.viewmodel" import './json_viewer.scss' type JsonViewerProbs = { - json: JSON + json: JSON, + options?: { + searchEnabled?: boolean + editable?: boolean + } } -export const JsonViewer = ({ json }: JsonViewerProbs) => { +export const JsonViewer = ({ json, options = { searchEnabled: true, editable: true } }: JsonViewerProbs) => { const { t } = useTranslation('common'); const htmlContainer = useRef(null); const search = useRef<HTMLInputElement>(null); @@ -84,14 +88,16 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { > <td style={{ marginLeft: tabs + 'em' }} className={"d-flex align-items-center "}>{icon}<span> <span dangerouslySetInnerHTML={{ __html: concatenatedKey }} /></span></td> <td className="text-element text-truncate" dangerouslySetInnerHTML={{ __html: readableValue }}></td> - <td className="text-end"> - <div className="d-flex icons justify-content-end align-items-center"> - <FontAwesomeIcon icon={faPenToSquare} size="sm" /> - <FontAwesomeIcon icon={faTrashCan} size="sm" /> - </div> - </td> + {options?.editable && + <td className="text-end"> + <div className="d-flex icons justify-content-end align-items-center"> + <FontAwesomeIcon icon={faPenToSquare} size="sm" /> + <FontAwesomeIcon icon={faTrashCan} size="sm" /> + </div> + </td> + } </tr > - {isObject && collapsed ? renderInner(innerChild, nested + 1, concatenatedKey, path) : ''} + {isObject && collapsed && renderInner(innerChild, nested + 1, concatenatedKey, path)} </React.Fragment > ) }) @@ -99,7 +105,7 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { const renderJson = (json: JSON): JSX.Element => { return ( - <Table className="list-group-tr"> + <Table className="m-0 p-0 list-unstyled"> <tbody> { renderInner(json) @@ -121,19 +127,17 @@ export const JsonViewer = ({ json }: JsonViewerProbs) => { ) }, [json, collapseable, searchTerm]) - const searchHTML = () => { + const searchHTML = (): React.ReactElement => { return ( - <> - <Form.Group controlId='json_viewer.search' className='p-0 mx-1 pt-2'> - <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={search} /> - </Form.Group> - </> + <Form.Group controlId='json_viewer.search' className='p-0 mx-1 pt-2'> + <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={search} /> + </Form.Group> ) } return ( <div ref={htmlContainer}> - {searchHTML()} + {options?.searchEnabled && searchHTML()} {breadcrumbHTML} {hierarchyHTML} </div> diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index f0bc92212..832e2b229 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -67,12 +67,8 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy } const registerMenuOptions = () => { - if (!container.current) { - return () => { } - } - - const subscription = subscribe({ - target: container.current, + const subscription = subscribe!({ + target: container.current!, actions: [ { key: t('json_viewer.copy'), @@ -139,8 +135,18 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy }, [searchTerm]) useEffect(() => { - const unsubscribe = registerMenuOptions(); + if (!container.current || !subscribe) { + return + } + + const unsubscribe = registerMenuOptions() + + return () => { + unsubscribe() + } + }, [subscribe]) + useEffect(() => { if (search.current) { search.current.addEventListener('input', handleSearchInput) } @@ -149,7 +155,6 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy if (search.current) { search.current.removeEventListener('input', handleSearchInput) } - unsubscribe() } }, []) diff --git a/react-ui/src/shared/icons/icons.ts b/react-ui/src/shared/icons/icons.ts deleted file mode 100755 index 9c8791cc9..000000000 --- a/react-ui/src/shared/icons/icons.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { library } from '@fortawesome/fontawesome-svg-core' -import { faSpinner } from '@fortawesome/free-solid-svg-icons' - -library.add(faSpinner) \ No newline at end of file diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx index c184e655b..710e17889 100644 --- a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx @@ -15,7 +15,7 @@ export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { const [mounted, setMounted] = useState(false); const layouts = { lg: [ - { i: 'device-list', x: 0, y: 0, w: 1, h: 1, minW: 1, minH: 1 }, + { i: 'device-list', x: 0, y: 0, w: 2, h: 1, minW: 2, minH: 1 }, { i: 'device-details', x: 2, y: 0, w: 2, h: 1, minW: 2, minH: 1 } ] }; diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss index 53158f515..98475a02e 100755 --- a/react-ui/src/shared/style/box.scss +++ b/react-ui/src/shared/style/box.scss @@ -1,17 +1,39 @@ @import "./colors.scss"; -$box-padding: 10px; +$box-padding: 1em; $border-radius: 0.25em; $border-width: 2px; $transition-duration: 0.3s; .c-box { - padding: $box-padding; + padding: $box-padding !important; background-color: white; position: relative; - border-radius: $border-radius; transition: box-shadow $transition-duration ease-in-out; + @extend .border-gradient; + @extend .rounded; + box-shadow: $box-shadow; + + &:hover { + box-shadow: 0 0.5rem 1rem rgba(map-get($theme-colors, "primary"), 0.2); + + &::before { + opacity: 1; + } + } +} + +.rounded { + border-radius: $border-radius; +} + +.abstract-box { + padding: $box-padding; + font-size: 0.9em; + border-radius: calc($border-radius / 2); +} +.border-gradient { background: linear-gradient(white, white) padding-box, linear-gradient( @@ -22,7 +44,6 @@ $transition-duration: 0.3s; ) border-box; border: $border-width solid transparent; - box-shadow: $box-shadow; &::before { content: ""; @@ -42,18 +63,34 @@ $transition-duration: 0.3s; opacity: 0; transition: opacity $transition-duration ease-in-out; } +} - &:hover { - box-shadow: 0 0.5rem 1rem rgba(map-get($theme-colors, "primary"), 0.2); +@property --startOpacity { + syntax: "<number>"; + initial-value: 0.35; + inherits: false; +} - &::before { - opacity: 1; - } - } +@property --startPosition { + syntax: "<percentage>"; + initial-value: 10%; + inherits: false; } -.abstract-box { - padding: $box-padding; - font-size: 0.9em; - border-radius: calc($border-radius / 2); +.bg-gradient-fade { + $primary-color: map-get($theme-colors, "primary"); + background: linear-gradient( + to bottom, + rgba($primary-color, var(--startOpacity)) var(--startPosition), + rgba($primary-color, 0.1) 100% + ); + + &:hover { + --startOpacity: 0.4; + --startPosition: 30%; + } + + transition: + --startOpacity $transition-duration ease-in-out, + --startPosition $transition-duration ease-in-out; } diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss index 4469a4a5b..bbeff3733 100755 --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -5,7 +5,8 @@ $theme-colors: ( "danger": #ff0000, "warning": #dbd116, "dark": #595959, - "black": #000000 + "black": #000000, + "disabled": #8e8e8e ); $box-shadow: 0px 4px 8px rgba(map-get($theme-colors, "primary"), 0.2); diff --git a/renovate.json b/renovate.json old mode 100644 new mode 100755 -- GitLab From 449fdfff24c2bca27949d2ec737a9365d4f42881 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 20 Jan 2025 17:18:58 +0100 Subject: [PATCH 63/78] (ui): add metadata information --- .../src/components/devices/view/device.scss | 38 +++++++++ .../devices/view/device.view.table.tsx | 12 +-- .../components/devices/view/device.view.tsx | 10 +-- .../subcomponent/device.view.list-detail.tsx | 80 ++++++++----------- .../devices/view_model/device.viewmodel.ts | 3 +- .../src/i18n/locales/en/translations.json | 3 - .../json_viewer/view/json_viewer.view.tsx | 15 +--- .../viewmodel/json_viewer.viewmodel.tsx | 2 +- react-ui/src/shared/style/box.scss | 52 +++++------- 9 files changed, 108 insertions(+), 107 deletions(-) diff --git a/react-ui/src/components/devices/view/device.scss b/react-ui/src/components/devices/view/device.scss index 8d4099fc8..bce275265 100755 --- a/react-ui/src/components/devices/view/device.scss +++ b/react-ui/src/components/devices/view/device.scss @@ -55,3 +55,41 @@ text-decoration: underline; } } +.transitions { + $transition-duration-hover: 0.1s; + $transition-duration-change: 0.2s; + transition: + --startOpacity $transition-duration-hover ease-in-out, + --startPosition $transition-duration-hover ease-in-out; +} + +@property --startOpacity { + syntax: "<number>"; + initial-value: 0.35; + inherits: false; +} + +@property --startPosition { + syntax: "<percentage>"; + initial-value: 10%; + inherits: false; +} + +.bg-gradient-fade { + $primary-color: map-get($theme-colors, "primary"); + background: linear-gradient( + to bottom, + rgba($primary-color, var(--startOpacity)) var(--startPosition), + rgba($primary-color, 0.1) 100% + ); + + &:hover { + --startOpacity: 0.4; + --startPosition: 30%; + } +} + +.disabled-hover:hover { + $primary-color: rgba(map-get($theme-colors, "dark"), 0.1); + background: linear-gradient(to bottom, rgb(223, 223, 223) 1%, white 100%); +} diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx index f1eb53130..ff46862e7 100755 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ b/react-ui/src/components/devices/view/device.view.table.tsx @@ -27,7 +27,7 @@ export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElemen const { id } = device setExpandedId(expandedId === id ? null : id); }, [expandedId]); - + 1 const getDeviceList = useCallback(() => { const search = searchRef?.current?.value; let filtered = devices; @@ -53,12 +53,14 @@ export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElemen return ( <div key={deviceId} - className={`border-bottom border-primary p-2 transition-bg ${isSelected && 'bg-gradient-fade'} ${!isSelected && 'text-disabled'}`} + className={`border-bottom border-primary p-2 transitions ${isSelected && 'bg-gradient-fade py-2'} ${!isSelected && 'text-disabled disabled-hover'}`} + onClick={() => !isExpanded && handleItemClick(device)} > <div aria-expanded={isExpanded} - className="d-flex justify-content-between py-4 clickable" - onClick={() => handleItemClick(device)}> + className="d-flex justify-content-between py-2 clickable" + onClick={() => isExpanded && handleItemClick(device)} + > <FontAwesomeIcon icon={faChevronDown} rotation={isExpanded ? undefined : 270} /> <span dangerouslySetInnerHTML={{ __html: search ? insertMarkTags(devicename, search) : DOMPurify.sanitize(devicename) @@ -85,7 +87,7 @@ export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElemen return ( <div className="rounded border border-primary mt-2"> - <div className="border-bottom border-primary d-flex justify-content-between px-4 py-2 clickable" onClick={() => handleItemClick(device)}> + <div className="border-bottom border-primary d-flex justify-content-between px-4 py-2 clickable"> <FontAwesomeIcon icon={faChevronDown} className="opacity-0" /> <span className="font-medium">{t('device.table.header.name')}</span> <span className="font-medium">{t('device.table.header.uuid')}</span> diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 3e4b822d0..350abadd0 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -14,7 +14,7 @@ import { DeviceList } from './device.view.table'; const DeviceView = () => { const { t } = useTranslation('common'); const searchRef = useRef<HTMLInputElement>(null); - const { jsonYang } = useDeviceViewModel(); + const { jsonYang, selectedDevice } = useDeviceViewModel(); return ( <div className='m-4 pt-4'> @@ -28,8 +28,8 @@ const DeviceView = () => { /> <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row> - <Col sm={12} className='mt-4'> - <h3 className='text-black-50'>{t('device.title')}</h3> + <Col sm={12}> + <h3 className='c-box-title'>{t('device.title')}</h3> </Col> </Row> <Row> @@ -59,8 +59,8 @@ const DeviceView = () => { /> <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row> - <Col xs={12} className='mt-4'> - {t('device.tabs.yang_model.title')} + <Col xs={12}> + <h3 className='c-box-title'>{t('device.tabs.yang_model.title')} <small>{selectedDevice?.device.name}</small></h3> </Col> </Row> <Row className='align-items-start'> diff --git a/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx b/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx index 6e904313d..7473eba6c 100644 --- a/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx +++ b/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx @@ -4,7 +4,7 @@ import { insertMarkTags } from "@helper/text"; import { useAppSelector } from "@hooks"; import { JsonViewer } from "@shared/components/json_viewer/view/json_viewer.view"; import DOMPurify from 'dompurify'; -import { useCallback, useEffect, useState } from "react"; +import { useState } from "react"; import { Collapse } from "react-bootstrap"; interface DeviceListCollapsableProps { @@ -13,60 +13,48 @@ interface DeviceListCollapsableProps { search?: string, } - export const DeviceListCollapsable = ({ deviceId, username, search }: DeviceListCollapsableProps) => { const { selected } = useAppSelector(state => state.device); - const [metadata, setMetadata] = useState<boolean>(false) - - - useEffect(() => { - if (!selected?.json) return; - }) - - + const [metadata, setMetadata] = useState<boolean>(true) - const content = useCallback(() => { - if (!selected?.json) return; + const json = selected?.json || {} - const key = Object.keys(selected.json).at(2) as keyof typeof selected.json - const metadataObject = selected.json[key] as JSON; + const key = Object.keys(json).at(2) as keyof typeof json + const metadataObject = json[key] as JSON || {}; - return ( - <div id={`collapse-${deviceId}`}> - <div className="pb-4 pt-1 d-flex flex-column gap-1" > - <div className="d-flex justify-content-between"> - <div> - <FontAwesomeIcon className="me-2" icon={faHashtag} /> - UUID: - </div> - <span dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(deviceId, search) : DOMPurify.sanitize(deviceId) - }} /> + return ( + <div id={`collapse-${deviceId}`}> + <div className="pb-4 pt-1 d-flex flex-column gap-1" > + <div className="d-flex justify-content-between"> + <div> + <FontAwesomeIcon className="me-2" icon={faHashtag} /> + UUID: </div> - <div className="d-flex justify-content-between"> - <div> - <FontAwesomeIcon className="me-2" icon={faUser} /> - User: - </div> - <span>{username}</span> + <span dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(deviceId, search) : DOMPurify.sanitize(deviceId) + }} /> + </div> + <div className="d-flex justify-content-between"> + <div> + <FontAwesomeIcon className="me-2" icon={faUser} /> + User: </div> + <span>{username}</span> + </div> - <div className="d-flex justify-content-between clickable border-top border-dark mt-3 pt-2" aria-expanded={metadata} onClick={() => setMetadata(!metadata)}> - <div> - <FontAwesomeIcon icon={faChevronDown} rotation={metadata ? undefined : 270} /> - Metadata: - </div> + <div className="d-flex justify-content-between clickable border-top border-dark mt-3 pt-1" aria-expanded={metadata} onClick={() => setMetadata(!metadata)}> + <div> + <FontAwesomeIcon icon={faChevronDown} rotation={metadata ? undefined : 270} /> + Metadata </div> - - <Collapse in={metadata}> - <div id={`collapse-${deviceId}`}> - {JsonViewer({ json: metadataObject, options: { editable: false, searchEnabled: false } })} - </div> - </Collapse> </div> - </div > - ) - }, [metadata]) - return content() + <Collapse in={metadata}> + <div id={`collapse-${deviceId}`}> + {JsonViewer({ json: metadataObject, options: { editable: false, searchEnabled: false } })} + </div> + </Collapse> + </div> + </div > + ) } \ No newline at end of file diff --git a/react-ui/src/components/devices/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts index ba2ee88a9..f2fd63553 100755 --- a/react-ui/src/components/devices/view_model/device.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.viewmodel.ts @@ -22,6 +22,7 @@ export const useDeviceViewModel = () => { const jsonYang = useMemo<JSON | null>(getYangModelJSON, [selectedDevice]) return { - jsonYang + jsonYang, + selectedDevice } } diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index 53444b9e0..e23061744 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -47,9 +47,6 @@ }, "add_device_button": "Add device", "tabs": { - "metadata": { - "title": "Metadata" - }, "yang_model": { "title": "YANG Model" } diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index da107ca93..ba53d64d7 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -23,18 +23,6 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr const { getSubset, breadcrumbs, isCollapsed, collapseable, collapse, parameterizedJson, searchTerm } = useJsonViewer({ json, search, container: htmlContainer }); - const breadcrumbHTML = useMemo(() => { - return ( - <nav aria-label="breadcrumb"> - <ol className="breadcrumb"> - {breadcrumbs.map(breadcrumb => ( - <li key={breadcrumb} className="breadcrumb-item"><a href="#">{breadcrumb}</a></li> - ))} - </ol> - </nav> - ) - }, [breadcrumbs]) - const renderInner = (innerJson: JSON, nested: number = 0, parentKey: string = "", path: string = "/network-instance/0/"): JSX.Element => { path += parentKey + (parentKey === "" ? "" : "/") @@ -129,7 +117,7 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr const searchHTML = (): React.ReactElement => { return ( - <Form.Group controlId='json_viewer.search' className='p-0 mx-1 pt-2'> + <Form.Group controlId='json_viewer.search' className='p-0 '> <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={search} /> </Form.Group> ) @@ -138,7 +126,6 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr return ( <div ref={htmlContainer}> {options?.searchEnabled && searchHTML()} - {breadcrumbHTML} {hierarchyHTML} </div> ) diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index 832e2b229..6a0c80c7e 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -132,7 +132,7 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy innerSearch(json, searchTerm); return parameterizedJsonMap - }, [searchTerm]) + }, [searchTerm, json]) useEffect(() => { if (!container.current || !subscribe) { diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss index 98475a02e..62dd6530d 100755 --- a/react-ui/src/shared/style/box.scss +++ b/react-ui/src/shared/style/box.scss @@ -1,12 +1,12 @@ @import "./colors.scss"; -$box-padding: 1em; +$box-padding: 1.5em; $border-radius: 0.25em; $border-width: 2px; $transition-duration: 0.3s; .c-box { - padding: $box-padding !important; + padding: $box-padding / 2 $box-padding !important; background-color: white; position: relative; transition: box-shadow $transition-duration ease-in-out; @@ -23,6 +23,24 @@ $transition-duration: 0.3s; } } +.c-box-title { + $text-color: black; + color: $text-color; + padding: 0.5em 0; + margin-top: 0.2em; + + small { + font-size: 0.75em; + color: rgba($text-color, 0.65); + &::before { + content: "("; + } + &::after { + content: ")"; + } + } +} + .rounded { border-radius: $border-radius; } @@ -64,33 +82,3 @@ $transition-duration: 0.3s; transition: opacity $transition-duration ease-in-out; } } - -@property --startOpacity { - syntax: "<number>"; - initial-value: 0.35; - inherits: false; -} - -@property --startPosition { - syntax: "<percentage>"; - initial-value: 10%; - inherits: false; -} - -.bg-gradient-fade { - $primary-color: map-get($theme-colors, "primary"); - background: linear-gradient( - to bottom, - rgba($primary-color, var(--startOpacity)) var(--startPosition), - rgba($primary-color, 0.1) 100% - ); - - &:hover { - --startOpacity: 0.4; - --startPosition: 30%; - } - - transition: - --startOpacity $transition-duration ease-in-out, - --startPosition $transition-duration ease-in-out; -} -- GitLab From 5f70bebb562a0c0bd0a16f2e67de46a46446608e Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Wed, 22 Jan 2025 22:10:33 +0100 Subject: [PATCH 64/78] (ui): add background animation --- react-ui/package.json | 1 + .../devices/view/device.view.list.tsx | 94 +++++++++++++++ .../devices/view/device.view.table.tsx | 99 ---------------- .../components/devices/view/device.view.tsx | 112 ++++++++---------- .../subcomponent/device.view.list-detail.tsx | 45 +++++-- ....viewmodel.ts => device.list.viewmodel.ts} | 0 react-ui/src/index.scss | 9 +- react-ui/src/index.tsx | 30 +++-- .../components/background/background.view.tsx | 92 ++++++++++++++ .../shared/components/box/gridBox.view.scss | 67 +++++++++++ .../shared/components/box/gridBox.view.tsx | 37 ++++++ .../reducer/json_viewer.reducer.ts | 12 +- .../json_viewer/view/json_viewer.view.tsx | 26 ++-- .../viewmodel/json_viewer.viewmodel.tsx | 10 +- .../layouts/grid.layout/grid.layout.scss | 9 +- .../layouts/grid.layout/grid.layout.tsx | 58 +++++++-- .../protected.layout/protected.layout.tsx | 8 +- react-ui/src/shared/style/box.scss | 84 ------------- react-ui/src/shared/style/colors.scss | 35 ++++++ react-ui/src/shared/style/index.scss | 10 +- react-ui/src/shared/style/skeleton.scss | 3 + react-ui/yarn.lock | 5 + 22 files changed, 530 insertions(+), 316 deletions(-) create mode 100755 react-ui/src/components/devices/view/device.view.list.tsx delete mode 100755 react-ui/src/components/devices/view/device.view.table.tsx rename react-ui/src/components/devices/view_model/{device.table.viewmodel.ts => device.list.viewmodel.ts} (100%) create mode 100644 react-ui/src/shared/components/background/background.view.tsx create mode 100644 react-ui/src/shared/components/box/gridBox.view.scss create mode 100644 react-ui/src/shared/components/box/gridBox.view.tsx delete mode 100755 react-ui/src/shared/style/box.scss create mode 100644 react-ui/src/shared/style/skeleton.scss diff --git a/react-ui/package.json b/react-ui/package.json index 1f742d78d..8bdbbfa50 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -27,6 +27,7 @@ "react-error-boundary": "^4.1.2", "react-grid-layout": "^1.5.0", "react-i18next": "^15.0.0", + "react-loading-skeleton": "^3.5.0", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", "react-toastify": "^10.0.5", diff --git a/react-ui/src/components/devices/view/device.view.list.tsx b/react-ui/src/components/devices/view/device.view.list.tsx new file mode 100755 index 000000000..53f1580d1 --- /dev/null +++ b/react-ui/src/components/devices/view/device.view.list.tsx @@ -0,0 +1,94 @@ +import { insertMarkTags } from "@helper/text"; +import { useAppSelector } from "@hooks"; +import DOMPurify from 'dompurify'; +import { RefObject, useCallback, useRef } from 'react'; +import { Col, OverlayTrigger, Row, Tooltip } from 'react-bootstrap'; +import { useTranslation } from "react-i18next"; +import { Device } from "../reducer/device.reducer"; +import { useDeviceTableViewModel } from "../view_model/device.list.viewmodel"; + +const cropUUID = (uuid: string): string => { + return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); +}; + +export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElement> }) => { + const { devices, pnds, selected: selectedDevice } = useAppSelector(state => state.device); + const { t } = useTranslation('common'); + const listRef = useRef<HTMLDivElement>(null); + const { dispatchDevice } = useDeviceTableViewModel(searchRef, listRef); + + const handleItemClick = useCallback((device: Device) => { + dispatchDevice(device) + }, []); + + const getDeviceList = useCallback(() => { + const search = searchRef?.current?.value; + let filtered = devices; + + if (search) { + filtered = devices.filter((device) => { + const user = pnds.find(pnd => pnd.id === device.pid); + return device.id?.includes(search) || + device.name?.includes(search) || + user?.name?.includes(search); + }); + } + + return filtered.map((device) => { + const user = pnds.find(pnd => pnd.id === device.pid); + const username = user?.name || ''; + const deviceId = device.id!; + const croppedId = cropUUID(deviceId); + const devicename = device.name || ''; + const isSelected = selectedDevice?.device.id === deviceId; + + return ( + <div + key={deviceId} + className={`border-bottom border-primary p-2 transitions ${isSelected && 'bg-gradient-fade py-2'} ${!isSelected && 'text-disabled disabled-hover'}`} + onClick={() => handleItemClick(device)} + > + <Row + className="align-items-center clickable" + onClick={() => handleItemClick(device)} + > + <Col xs={12} sm={5} > + <span dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(devicename, search) : DOMPurify.sanitize(devicename) + }} /> + </Col> + <Col xs={12} sm={3} > + <OverlayTrigger overlay={<Tooltip id={deviceId}>{deviceId}</Tooltip>}> + <span className="text-gray-500" dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(croppedId, search) : DOMPurify.sanitize(croppedId) + }} /> + </OverlayTrigger> + </Col> + <Col xs={12} sm={4} > + <span className="text-gray-500" dangerouslySetInnerHTML={{ + __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) + }} /> + </Col> + </Row> + </div> + ); + }); + }, [devices, searchRef, pnds, selectedDevice, handleItemClick]); + + return ( + <div className="rounded border border-primary mt-2"> + <Row className="border-bottom border-primary px-2 py-2 mx-0"> + <Col xs={12} sm={5} > + <span className="font-medium">{t('device.table.header.name')}</span> + </Col> + <Col xs={12} sm={3} > + <span className="font-medium">{t('device.table.header.uuid')}</span> + </Col> + <Col xs={12} sm={4} > + <span className="font-medium">{t('device.table.header.user')}</span> + </Col> + </Row> + <div ref={listRef}>{getDeviceList()}</div> + </div> + ); +}; \ No newline at end of file diff --git a/react-ui/src/components/devices/view/device.view.table.tsx b/react-ui/src/components/devices/view/device.view.table.tsx deleted file mode 100755 index ff46862e7..000000000 --- a/react-ui/src/components/devices/view/device.view.table.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { faChevronDown } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { insertMarkTags } from "@helper/text"; -import { useAppSelector } from "@hooks"; -import DOMPurify from 'dompurify'; -import { RefObject, useCallback, useRef, useState } from 'react'; -import { Collapse, OverlayTrigger, Tooltip } from 'react-bootstrap'; -import { useTranslation } from "react-i18next"; -import { Device } from "../reducer/device.reducer"; -import { useDeviceTableViewModel } from "../view_model/device.table.viewmodel"; -import { DeviceListCollapsable } from "./subcomponent/device.view.list-detail"; - -const cropUUID = (uuid: string): string => { - return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); -}; - -export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElement> }) => { - const { devices, pnds, selected: selectedDevice } = useAppSelector(state => state.device); - const { t } = useTranslation('common'); - const [expandedId, setExpandedId] = useState<string | null | undefined>(null); - const listRef = useRef<HTMLDivElement>(null); - const { dispatchDevice } = useDeviceTableViewModel(searchRef, listRef); - - const handleItemClick = useCallback((device: Device) => { - dispatchDevice(device) - - const { id } = device - setExpandedId(expandedId === id ? null : id); - }, [expandedId]); - 1 - const getDeviceList = useCallback(() => { - const search = searchRef?.current?.value; - let filtered = devices; - - if (search) { - filtered = devices.filter((device) => { - const user = pnds.find(pnd => pnd.id === device.pid); - return device.id?.includes(search) || - device.name?.includes(search) || - user?.name?.includes(search); - }); - } - - return filtered.map((device) => { - const user = pnds.find(pnd => pnd.id === device.pid); - const username = user?.name || ''; - const deviceId = device.id!; - const croppedId = cropUUID(deviceId); - const devicename = device.name || ''; - const isExpanded = expandedId === deviceId; - const isSelected = selectedDevice?.device.id === deviceId; - - return ( - <div - key={deviceId} - className={`border-bottom border-primary p-2 transitions ${isSelected && 'bg-gradient-fade py-2'} ${!isSelected && 'text-disabled disabled-hover'}`} - onClick={() => !isExpanded && handleItemClick(device)} - > - <div - aria-expanded={isExpanded} - className="d-flex justify-content-between py-2 clickable" - onClick={() => isExpanded && handleItemClick(device)} - > - <FontAwesomeIcon icon={faChevronDown} rotation={isExpanded ? undefined : 270} /> - <span dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(devicename, search) : DOMPurify.sanitize(devicename) - }} /> - <OverlayTrigger overlay={<Tooltip id={deviceId}>{deviceId}</Tooltip>}> - <span className="text-gray-500" dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(croppedId, search) : DOMPurify.sanitize(croppedId) - }} /> - </OverlayTrigger> - <span className="text-gray-500" dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) - }} /> - </div> - - <Collapse in={isExpanded}> - <div> - <DeviceListCollapsable deviceId={deviceId} username={username} search={search} /> - </div> - </Collapse> - </div> - ); - }); - }, [devices, searchRef, pnds, selectedDevice, expandedId, handleItemClick]); - - return ( - <div className="rounded border border-primary mt-2"> - <div className="border-bottom border-primary d-flex justify-content-between px-4 py-2 clickable"> - <FontAwesomeIcon icon={faChevronDown} className="opacity-0" /> - <span className="font-medium">{t('device.table.header.name')}</span> - <span className="font-medium">{t('device.table.header.uuid')}</span> - <span className="font-medium">{t('device.table.header.user')}</span> - </div> - <div ref={listRef}>{getDeviceList()}</div> - </div> - ); -}; \ No newline at end of file diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 350abadd0..636991ff1 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,80 +1,68 @@ -import { faGripVertical, faPlus } from '@fortawesome/free-solid-svg-icons'; +import { faPlus } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { GridLayout } from '@layout/grid.layout/grid.layout'; -import UpdateIndicator from '@layout/grid.layout/update-inidicator.layout/update-indicator.layout'; +import { GridBox } from '@shared/components/box/gridBox.view'; import { JsonViewer } from '@shared/components/json_viewer/view/json_viewer.view'; -import { Category, CategoryType } from '@shared/types/category.type'; import { useRef } from 'react'; -import { Button, Col, Container, Form, Row } from 'react-bootstrap'; +import { Button, Col, Form, Row } from 'react-bootstrap'; import { useTranslation } from 'react-i18next'; import { useDeviceViewModel } from '../view_model/device.viewmodel'; import './device.scss'; -import { DeviceList } from './device.view.table'; +import { DeviceList } from './device.view.list'; +import { DeviceListCollapsable } from './subcomponent/device.view.list-detail'; const DeviceView = () => { const { t } = useTranslation('common'); const searchRef = useRef<HTMLInputElement>(null); - const { jsonYang, selectedDevice } = useDeviceViewModel(); + const { jsonYang } = useDeviceViewModel(); return ( - <div className='m-4 pt-4'> - <GridLayout> - <> - <div key="device-list"> - <Container className='c-box hoverable h-100'> - <UpdateIndicator - category={Category.DEVICE as CategoryType} - updateInterval={15000} - /> - <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> - <Row> - <Col sm={12}> - <h3 className='c-box-title'>{t('device.title')}</h3> - </Col> - </Row> - <Row> - <Col xs={12} sm={6}> - <Form.Group controlId='device.search' className='p-0 mx-1 pt-2'> - <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> - </Form.Group> - </Col> - <Col xs={12} sm={{ span: 4, offset: 2 }} className='pt-2'> - <Button variant='primary' className='float-end'><FontAwesomeIcon icon={faPlus} className='me-1' />{t('device.add_device_button')}</Button> - </Col> - </Row> + <GridLayout> + <> + <div key="device-list"> + <GridBox title={t("device.title")}> + <Row className="mb-3 align-items-center"> + <Col xs={12} md={6} lg={8}> + <Form.Group controlId='device.search'> + <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> + </Form.Group> + </Col> + <Col xs={12} md={6} lg={4} className='mt-3 mt-md-0 text-md-end'> + <Button variant='primary'> + <FontAwesomeIcon icon={faPlus} className='me-2' /> + {t('device.add_device_button')} + </Button> + </Col> + </Row> + <Row> + <Col xs={12} className='h-auto'> + <DeviceList searchRef={searchRef} /> + </Col> + </Row> + </GridBox> + </div> - <Row className='align-items-start'> - <Col sm={12} className='pt-2'> - {DeviceList({ searchRef })} - </Col> - </Row> - </Container> - </div> + <div key="device-metadata"> + <GridBox title={t("device.title")}> + <Row> + <Col xs={12} > + <DeviceListCollapsable search={searchRef.current?.value || ''} /> + </Col> + </Row> + </GridBox> + </div> - <div key="device-details"> - <Container className='c-box hoverable h-100'> - <UpdateIndicator - category={Category.TAB as CategoryType} - updateInterval={5000} - /> - <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> - <Row> - <Col xs={12}> - <h3 className='c-box-title'>{t('device.tabs.yang_model.title')} <small>{selectedDevice?.device.name}</small></h3> - </Col> - </Row> - <Row className='align-items-start'> - <Col xs={12}> - {jsonYang && - <JsonViewer json={jsonYang} /> - } - </Col> - </Row> - </Container> - </div> - </> - </GridLayout> - </div> + <div key="device-details"> + <GridBox title={t('device.tabs.yang_model.title')}> + <Row> + <Col xs={12}> + {jsonYang && <JsonViewer json={jsonYang} />} + </Col> + </Row> + </GridBox> + </div> + </> + </GridLayout> ); }; diff --git a/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx b/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx index 7473eba6c..ba146d782 100644 --- a/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx +++ b/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx @@ -8,19 +8,33 @@ import { useState } from "react"; import { Collapse } from "react-bootstrap"; interface DeviceListCollapsableProps { - deviceId: string - username: string search?: string, } -export const DeviceListCollapsable = ({ deviceId, username, search }: DeviceListCollapsableProps) => { +enum Collapsables { + Metadata = 1, + Config = 2 +} + +export const DeviceListCollapsable = ({ search }: DeviceListCollapsableProps) => { const { selected } = useAppSelector(state => state.device); - const [metadata, setMetadata] = useState<boolean>(true) + const [collapseable, setCollapsable] = useState<Collapsables | undefined>(undefined) + const username = selected?.device.name || ""; + const deviceId = selected?.device.id || ""; const json = selected?.json || {} - const key = Object.keys(json).at(2) as keyof typeof json - const metadataObject = json[key] as JSON || {}; + const metadataKey = Object.keys(json).at(2) as keyof typeof json + const metadataObject = json[metadataKey] as JSON || {}; + + const configKey = Object.keys(json).at(0) as keyof typeof json + const configObject = json[configKey] as JSON || {}; + + + const setCollapsed = (prev: Collapsables) => { + const next = collapseable === prev ? undefined : prev; + setCollapsable(next); + } return ( <div id={`collapse-${deviceId}`}> @@ -42,18 +56,31 @@ export const DeviceListCollapsable = ({ deviceId, username, search }: DeviceList <span>{username}</span> </div> - <div className="d-flex justify-content-between clickable border-top border-dark mt-3 pt-1" aria-expanded={metadata} onClick={() => setMetadata(!metadata)}> + <div className="d-flex justify-content-between clickable border-top border-dark mt-3 pt-3" aria-expanded={collapseable === Collapsables.Metadata} onClick={() => setCollapsed(Collapsables.Metadata)}> <div> - <FontAwesomeIcon icon={faChevronDown} rotation={metadata ? undefined : 270} /> + <FontAwesomeIcon icon={faChevronDown} rotation={collapseable === Collapsables.Metadata ? undefined : 270} /> Metadata </div> </div> - <Collapse in={metadata}> + <Collapse in={collapseable === Collapsables.Metadata}> <div id={`collapse-${deviceId}`}> {JsonViewer({ json: metadataObject, options: { editable: false, searchEnabled: false } })} </div> </Collapse> + + <div className="d-flex justify-content-between clickable mt-3" aria-expanded={collapseable === Collapsables.Config} onClick={() => setCollapsed(Collapsables.Config)}> + <div> + <FontAwesomeIcon icon={faChevronDown} rotation={collapseable === Collapsables.Config ? undefined : 270} /> + Config + </div> + </div> + + <Collapse in={collapseable === Collapsables.Config}> + <div id={`collapse-${deviceId}`}> + {JsonViewer({ json: configObject, options: { editable: false, searchEnabled: false } })} + </div> + </Collapse> </div> </div > ) diff --git a/react-ui/src/components/devices/view_model/device.table.viewmodel.ts b/react-ui/src/components/devices/view_model/device.list.viewmodel.ts similarity index 100% rename from react-ui/src/components/devices/view_model/device.table.viewmodel.ts rename to react-ui/src/components/devices/view_model/device.list.viewmodel.ts diff --git a/react-ui/src/index.scss b/react-ui/src/index.scss index 5c9f184b7..610261473 100755 --- a/react-ui/src/index.scss +++ b/react-ui/src/index.scss @@ -1,9 +1,16 @@ @import "./shared/style/index.scss"; +@import "./shared/style/colors.scss"; body { margin: 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - background-color: map-get($theme-colors, bg-primary) !important; + // background-color: map-get($theme-colors, bg-primary) !important; + + background: linear-gradient( + to top, + rgba(lighten(map-get($map: $theme-colors, $key: primary), 20%), 0.1) 0%, + rgba(map-get($map: $theme-colors, $key: bg-primary), 0.9) 90% + ); } diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 0a8fbbf25..7d6cfe0ac 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -1,9 +1,11 @@ import { UtilsProvider } from '@provider/utils.provider' +import AnimatedBackground from '@shared/components/background/background.view' import i18next from 'i18next' import React from 'react' import ReactDOM from 'react-dom/client' import { ErrorBoundary } from "react-error-boundary" import { I18nextProvider } from 'react-i18next' +import { SkeletonTheme } from 'react-loading-skeleton' import { Provider } from 'react-redux' import { RouterProvider @@ -19,18 +21,22 @@ window.env = window.location.hostname === 'localhost' ? 'development' : 'product ReactDOM.createRoot(document.getElementById("root")).render( <React.StrictMode> - <ErrorBoundary fallback={<div>Something went wrong</div>}> - <Provider store={store}> - <PersistGate loading={null} persistor={persistor}> - <I18nextProvider i18n={i18next}> - <UtilsProvider> - <ToastContainer /> - <RouterProvider router={router} /> - </UtilsProvider> - </I18nextProvider> - </PersistGate> - </Provider> - </ErrorBoundary> + <AnimatedBackground> + <ErrorBoundary fallback={<div>Something went wrong</div>}> + <SkeletonTheme height="2em" > + <Provider store={store}> + <PersistGate loading={null} persistor={persistor}> + <I18nextProvider i18n={i18next}> + <UtilsProvider> + <ToastContainer /> + <RouterProvider router={router} /> + </UtilsProvider> + </I18nextProvider> + </PersistGate> + </Provider> + </SkeletonTheme> + </ErrorBoundary> + </AnimatedBackground> </React.StrictMode> ); diff --git a/react-ui/src/shared/components/background/background.view.tsx b/react-ui/src/shared/components/background/background.view.tsx new file mode 100644 index 000000000..27cf56ceb --- /dev/null +++ b/react-ui/src/shared/components/background/background.view.tsx @@ -0,0 +1,92 @@ +import { useEffect, useRef, useState } from 'react'; + +const AnimatedBackground = ({ children }) => { + const containerRef = useRef(null); + const [linePaths, setLinePaths] = useState([]); + + useEffect(() => { + const updatePaths = () => { + if (containerRef.current) { + const box = containerRef.current.getBoundingClientRect(); + const width = box.width; + const height = box.height; + + // Calculate starting points and angles for parallel lines + const startX = width * 0; // Start from right side + const startY = height * 0.9; // Start from bottom + const endX = width * 1.2; // End at 30% of width + const endY = height * -0.3; // End at 30% of height + const spacing = 80; // 2em spacing between lines + + // Calculate angle and offsets + const angle = Math.atan2(startY - endY, startX - endX); + const xOffset = spacing * Math.sin(angle); + const yOffset = spacing * Math.cos(angle); + + // Create 5 parallel lines + const paths = Array.from({ length: 7 }).map((_, index) => { + const startXOffset = index * xOffset; + const startYOffset = index * yOffset; + + return `M ${startX - startXOffset} ${startY - startYOffset} + L ${endX - startXOffset} ${endY - startYOffset}`; + }); + + setLinePaths(paths); + } + }; + + updatePaths(); + window.addEventListener('resize', updatePaths); + return () => window.removeEventListener('resize', updatePaths); + }, []); + + return ( + <div ref={containerRef} className="position-relative min-vh-100"> + + {/* Animated lines */} + <div className="position-absolute w-100 h-100"> + <svg className="w-100 h-100"> + {linePaths.map((path, index) => ( + <g key={index}> + {/* Background line */} + {/* Animated border */} + <path + d={path} + fill="none" + stroke={`${index % 2 === 0 ? 'rgba(179, 80, 224, 0.4)' : 'rgba(150, 50, 190, .2)'}`} + strokeWidth="2" + strokeLinecap="round" + strokeDasharray="40 240" + style={{ + animation: `dash ${0.4 * index + 20}s linear infinite`, + }} + /> + </g> + ))} + </svg> + </div> + + {/* Content container */} + <div className="position-relative" style={{ zIndex: 10 }}> + {children} + </div> + + <style> + {` + @keyframes dash { + from { + stroke-dashoffset: 280; + } + to { + stroke-dashoffset: -280; + } + } + + `} + </style> + </div> + ); +}; + +export default AnimatedBackground; \ No newline at end of file diff --git a/react-ui/src/shared/components/box/gridBox.view.scss b/react-ui/src/shared/components/box/gridBox.view.scss new file mode 100644 index 000000000..f247f654c --- /dev/null +++ b/react-ui/src/shared/components/box/gridBox.view.scss @@ -0,0 +1,67 @@ +@import "/src/shared/style/colors.scss"; + +.grid-box:hover .grid-box-dependency { + opacity: 0.7; + transition: opacity 0.3s ease-in-out; +} + +.grid-box-dependency { + opacity: 0.4; + font-size: 0.9em; +} + +.grid-box .content { + overflow-x: clip; + overflow-y: auto; +} + +$box-padding: 1.5em; +$border-radius: 0.25em; +$border-width: 2px; +$transition-duration: 0.3s; + +.c-box { + padding: $box-padding / 2 $box-padding !important; + background-color: white; + position: relative; + transition: box-shadow $transition-duration ease-in-out; + @extend .border-gradient; + @extend .rounded; + box-shadow: $box-shadow; + + &:hover { + box-shadow: 0 0.5rem 1rem rgba(map-get($theme-colors, "primary"), 0.2); + + &::before { + opacity: 1; + } + } +} + +.c-box-title { + $text-color: black; + color: $text-color; + padding: 0.5em 0; + margin-top: 0.2em; + + small { + font-size: 0.75em; + color: rgba($text-color, 0.65); + &::before { + content: "("; + } + &::after { + content: ")"; + } + } +} + +.rounded { + border-radius: $border-radius; +} + +.abstract-box { + padding: $box-padding; + font-size: 0.9em; + border-radius: calc($border-radius / 2); +} diff --git a/react-ui/src/shared/components/box/gridBox.view.tsx b/react-ui/src/shared/components/box/gridBox.view.tsx new file mode 100644 index 000000000..77bed3913 --- /dev/null +++ b/react-ui/src/shared/components/box/gridBox.view.tsx @@ -0,0 +1,37 @@ +import { faGripVertical } from "@fortawesome/free-solid-svg-icons" +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" +import UpdateIndicator from "@layout/grid.layout/update-inidicator.layout/update-indicator.layout" +import { Category, CategoryType } from "@shared/types/category.type" +import { Col, Container, Row } from "react-bootstrap" +import './gridBox.view.scss' + +interface GridBoxProps { + title: string, + children: React.ReactNode, + className?: string, +} + + +export const GridBox: React.FC<GridBoxProps> = ({ children, title, className = "" }) => { + return ( + <div className="grid-box h-100"> + <Container fluid className={`c-box d-flex flex-column h-100 ${className}`}> + <div> + <UpdateIndicator + category={Category.DEVICE as CategoryType} + updateInterval={15000} + /> + <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> + <Row className="mb-0"> + <Col xs={12}> + <h4 className='c-box-title'>{title}</h4> + </Col> + </Row> + </div> + <div className="flex-grow-1 content"> + {children} + </div> + </Container> + </div> + ) +} \ No newline at end of file diff --git a/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts index dd432535c..093dde850 100755 --- a/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts +++ b/react-ui/src/shared/components/json_viewer/reducer/json_viewer.reducer.ts @@ -25,8 +25,6 @@ interface CollapsedItem { } export interface ReducerState { - breadcrumbs: Array<string>, - /** * Meta container containg identifier of * all non collapsed json objects @@ -35,7 +33,6 @@ export interface ReducerState { } const initialState: ReducerState = { - breadcrumbs: [], collapseContainer: [], } @@ -76,14 +73,11 @@ const JsonViewerSlice = createSlice({ collapsed: CollapseActions[collapse](item.collapsed) } }) - }, - setBreadcrumbs: (state, { payload }: PayloadAction<Array<string>>) => { - state.breadcrumbs = payload - }, - }, + } + } }) -export const { toggleCollapse, setBreadcrumbs } = JsonViewerSlice.actions +export const { toggleCollapse, } = JsonViewerSlice.actions export default JsonViewerSlice.reducer diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index ba53d64d7..68f0d6098 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -5,9 +5,11 @@ import DOMPurify from 'dompurify' import React, { Suspense, useMemo, useRef } from "react" import { Form, Table } from "react-bootstrap" import { useTranslation } from "react-i18next" +import Skeleton from 'react-loading-skeleton' import { useJsonViewer } from "../viewmodel/json_viewer.viewmodel" import './json_viewer.scss' + type JsonViewerProbs = { json: JSON, options?: { @@ -21,11 +23,15 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr const htmlContainer = useRef(null); const search = useRef<HTMLInputElement>(null); - const { getSubset, breadcrumbs, isCollapsed, collapseable, collapse, parameterizedJson, searchTerm } = useJsonViewer({ json, search, container: htmlContainer }); + const { getSubset, isCollapsed, collapseable, collapse, parameterizedJson, searchTerm } = useJsonViewer({ json, search, container: htmlContainer }); const renderInner = (innerJson: JSON, nested: number = 0, parentKey: string = "", path: string = "/network-instance/0/"): JSX.Element => { path += parentKey + (parentKey === "" ? "" : "/") + if (Object.entries(innerJson).length === 0) { + return <Skeleton count={3}></Skeleton> + } + return Object.entries(innerJson).map(([key, child]): JSX.Element => { let collapsed = isCollapsed(key, nested); @@ -104,18 +110,18 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr } - const hierarchyHTML = useMemo(() => { + const Hierarchy = useMemo(() => { const subset = getSubset(json); return ( - <> - <Suspense fallback={<div>loading...</div>}> - {renderJson(subset)} - </Suspense> - </> + <Suspense> + {renderJson(subset)} + </Suspense> ) }, [json, collapseable, searchTerm]) - const searchHTML = (): React.ReactElement => { + + + const Search = (): React.ReactElement => { return ( <Form.Group controlId='json_viewer.search' className='p-0 '> <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={search} /> @@ -125,8 +131,8 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr return ( <div ref={htmlContainer}> - {options?.searchEnabled && searchHTML()} - {hierarchyHTML} + {options?.searchEnabled && Search()} + {Hierarchy} </div> ) } \ No newline at end of file diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index 6a0c80c7e..ccbeac713 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -19,7 +19,7 @@ interface JsonViewerViewModelType { } export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelType) => { - const { breadcrumbs, collapseContainer } = useAppSelector(state => state.json_viwer) + const { collapseContainer } = useAppSelector(state => state.json_viwer) const dispatch = useAppDispatch(); const [searchTerm, setSearchTerm] = useState(''); const { toClipboard } = useUtils(); @@ -31,10 +31,8 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy const parameterizedJsonMap = useRef<Array<string>>([]); - const getSubset = (json: JSON) => { - const subset = breadcrumbs.reduce((nested, key) => nested?.[key], json); - - let inner = subset; + const getSubset = (json: JSON): JSON => { + let inner = json; const keys: Array<string> = []; while (Object.keys(inner).length === 1) { const key: string = Object.keys(inner)[0]; @@ -42,7 +40,6 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy keys.push(key); } - //dispatch(setBreadcrumbs([...breadcrumbs, ...keys])) return inner } @@ -160,7 +157,6 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy return { getSubset, - breadcrumbs, collapseable: collapseContainer, isCollapsed, collapse, diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.scss b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss index c90375d37..e1b04be80 100644 --- a/react-ui/src/shared/layouts/grid.layout/grid.layout.scss +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss @@ -24,8 +24,6 @@ } .react-grid-item { - min-height: 600px !important; - &.react-draggable-dragging { z-index: 100; @@ -35,12 +33,8 @@ } } -.react-grid-layout { - width: 100% !important; -} - .react-grid-item.react-grid-placeholder { - background: lighten(map-get($theme-colors, primary), 30%) !important; + background: lighten(map-get($theme-colors, primary), 10%) !important; opacity: 0.2; transition-duration: 100ms; z-index: 2; @@ -53,6 +47,7 @@ } .react-grid-item { + height: 100px; /* Hide resize handle by default */ .react-resizable-handle-se { opacity: 0; diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx index 710e17889..694c74478 100644 --- a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx @@ -1,4 +1,4 @@ -import React, { ReactElement, useEffect, useState } from 'react'; +import React, { ReactElement, useEffect, useRef, useState } from 'react'; import { Responsive, WidthProvider } from 'react-grid-layout'; import 'react-grid-layout/css/styles.css'; import 'react-resizable/css/styles.css'; @@ -10,20 +10,52 @@ interface GridLayoutProps { children: ReactElement; } +getComputedStyle +const RowCount = 2; +const padding = 80; // in px + + export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { - const rowHeight = 50; - const [mounted, setMounted] = useState(false); + const [rowHeight, setRowHeight] = useState<number>(0); + const [containerHeight, setContainerHeight] = useState<number>(0); + const [mounted, setMounted] = useState<boolean>(false); + const containerRef = useRef<HTMLDivElement>(null); + const layouts = { lg: [ - { i: 'device-list', x: 0, y: 0, w: 2, h: 1, minW: 2, minH: 1 }, - { i: 'device-details', x: 2, y: 0, w: 2, h: 1, minW: 2, minH: 1 } + { i: 'device-list', x: 0, y: 0, w: 2, h: 1, minW: 1, minH: 1 }, + { i: 'device-metadata', x: 0, y: 1, w: 2, h: 1, minW: 1, minH: 1 }, + { i: 'device-details', x: 2, y: 0, w: 2, h: 2, minW: 1, minH: 1 } ] }; + const calcHeights = () => { + const container = containerRef.current; + if (!container) { + // Fallback to body height if container is not available + const height = document.body.clientHeight * 0.7; + setRowHeight(Math.floor(height / RowCount)); + return; + } + + const { top } = container.getBoundingClientRect(); + const height = document.body.clientHeight - (top + padding); + setContainerHeight(height); + setRowHeight(Math.floor(height / RowCount)); + console.log(Math.floor(height / RowCount)); + + }; + + useEffect(() => { + calcHeights(); + }, [containerRef.current]) + useEffect(() => { setMounted(true); - // Force layout recalculation after mount - window.dispatchEvent(new Event('resize')); + + + window.addEventListener('resize', calcHeights); + return () => window.removeEventListener('resize', calcHeights); }, []); const gridItems = React.Children.map(children.props.children, (child, index) => { @@ -36,12 +68,19 @@ export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { }); return ( - <div style={{ display: mounted ? 'block' : 'none' }}> + <div + ref={containerRef} + style={{ + display: mounted ? 'block' : 'none', + height: `${containerHeight}px` + }} + > <ResponsiveGridLayout className="layout" layouts={layouts} breakpoints={{ lg: 996, sm: 480 }} cols={{ lg: 4, sm: 3 }} + maxRows={RowCount} rowHeight={rowHeight} margin={[20, 20]} draggableHandle=".drag-handle" @@ -50,7 +89,8 @@ export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { preventCollision={true} compactType={null} useCSSTransforms={mounted} - resizeHandles={['se']} // Only show resize handle in bottom right corner + resizeHandles={['se']} + > {gridItems} </ResponsiveGridLayout> diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx index dbcb49192..4e54f58de 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.tsx @@ -71,10 +71,10 @@ export const ProtectedLayout = () => { const HorizontalNavbar = () => { return ( - <Container fluid> + <Container fluid className="mb-4"> <Row> <Col> - <nav id="navbar" className="bg-white mx-4 mt-4 d-flex align-items-center c-box"> + <nav id="navbar" className="bg-white mx-4 mt-4 d-flex align-items-center c-box overflow-visible"> <Link to="/"><img src={logo} className="mx-4" width={45} alt="logo" /></Link> <Link className={"head-links" + handleActiveLink(DEVICE_URL)} to="/">{t('protected.link.device_list')}</Link> <Link className={"head-links" + handleActiveLink('/map')} to="/">{t('protected.link.map')}</Link> @@ -106,7 +106,9 @@ export const ProtectedLayout = () => { return ( <MenuProvider> {HorizontalNavbar()} - <Outlet /> + <div className="px-3"> + <Outlet /> + </div> </MenuProvider> ) }; \ No newline at end of file diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss deleted file mode 100755 index 62dd6530d..000000000 --- a/react-ui/src/shared/style/box.scss +++ /dev/null @@ -1,84 +0,0 @@ -@import "./colors.scss"; - -$box-padding: 1.5em; -$border-radius: 0.25em; -$border-width: 2px; -$transition-duration: 0.3s; - -.c-box { - padding: $box-padding / 2 $box-padding !important; - background-color: white; - position: relative; - transition: box-shadow $transition-duration ease-in-out; - @extend .border-gradient; - @extend .rounded; - box-shadow: $box-shadow; - - &:hover { - box-shadow: 0 0.5rem 1rem rgba(map-get($theme-colors, "primary"), 0.2); - - &::before { - opacity: 1; - } - } -} - -.c-box-title { - $text-color: black; - color: $text-color; - padding: 0.5em 0; - margin-top: 0.2em; - - small { - font-size: 0.75em; - color: rgba($text-color, 0.65); - &::before { - content: "("; - } - &::after { - content: ")"; - } - } -} - -.rounded { - border-radius: $border-radius; -} - -.abstract-box { - padding: $box-padding; - font-size: 0.9em; - border-radius: calc($border-radius / 2); -} - -.border-gradient { - background: - linear-gradient(white, white) padding-box, - linear-gradient( - 180deg, - rgba(map-get($theme-colors, "primary"), 0.4) 0%, - rgba(map-get($theme-colors, "primary"), 0.2) 40%, - rgba(map-get($theme-colors, "primary"), 0.1) 100% - ) - border-box; - border: $border-width solid transparent; - - &::before { - content: ""; - position: absolute; - top: -$border-width; - left: -$border-width; - right: -$border-width; - bottom: -$border-width; - background: linear-gradient( - 180deg, - rgba(map-get($theme-colors, "primary"), 0.4) 0%, - rgba(map-get($theme-colors, "primary"), 0.2) 60%, - rgba(map-get($theme-colors, "primary"), 0.1) 100% - ); - border-radius: inherit; - z-index: -1; - opacity: 0; - transition: opacity $transition-duration ease-in-out; - } -} diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss index bbeff3733..ce3c3cf90 100755 --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -10,5 +10,40 @@ $theme-colors: ( ); $box-shadow: 0px 4px 8px rgba(map-get($theme-colors, "primary"), 0.2); +$transition-duration: 0.3s; @import "/node_modules/bootstrap/scss/bootstrap"; + +// Gradients + +.border-gradient { + background: + linear-gradient(white, white) padding-box, + linear-gradient( + 180deg, + rgba(map-get($theme-colors, "primary"), 0.4) 0%, + rgba(map-get($theme-colors, "primary"), 0.2) 40%, + rgba(map-get($theme-colors, "primary"), 0.1) 100% + ) + border-box; + border: $border-width solid transparent; + + &::before { + content: ""; + position: absolute; + top: -$border-width; + left: -$border-width; + right: -$border-width; + bottom: -$border-width; + background: linear-gradient( + 180deg, + rgba(map-get($theme-colors, "primary"), 0.4) 0%, + rgba(map-get($theme-colors, "primary"), 0.2) 60%, + rgba(map-get($theme-colors, "primary"), 0.1) 100% + ); + border-radius: inherit; + z-index: -1; + opacity: 0; + transition: opacity $transition-duration ease-in-out; + } +} diff --git a/react-ui/src/shared/style/index.scss b/react-ui/src/shared/style/index.scss index e210c8415..b70f6c35e 100755 --- a/react-ui/src/shared/style/index.scss +++ b/react-ui/src/shared/style/index.scss @@ -1,5 +1,7 @@ @import "./fonts.scss"; -@import './colors.scss'; -@import './utils.scss'; -@import './box.scss'; -@import './toast.scss'; +@import "./colors.scss"; +@import "./utils.scss"; +@import "./toast.scss"; +@import "./skeleton.scss"; + +@import "/node_modules/react-loading-skeleton/dist/skeleton.css"; diff --git a/react-ui/src/shared/style/skeleton.scss b/react-ui/src/shared/style/skeleton.scss new file mode 100644 index 000000000..680cadd74 --- /dev/null +++ b/react-ui/src/shared/style/skeleton.scss @@ -0,0 +1,3 @@ +.react-loading-skeleton { + margin: 0.25em 0; +} diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index db8fb7d3c..224cc0ddd 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -8915,6 +8915,11 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-loading-skeleton@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz#da2090355b4dedcad5c53cb3f0ed364e3a76d6ca" + integrity sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ== + react-redux@^9.1.2: version "9.2.0" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.2.0.tgz#96c3ab23fb9a3af2cb4654be4b51c989e32366f5" -- GitLab From 819a98b60c531248ae117a91f30cc1da12770f92 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 23 Jan 2025 00:24:54 +0100 Subject: [PATCH 65/78] (ui): improve grid layout --- .../layouts/grid.layout/grid.layout.scss | 44 +++++++++++++- .../layouts/grid.layout/grid.layout.tsx | 60 +++++++------------ 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.scss b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss index e1b04be80..81ed130dd 100644 --- a/react-ui/src/shared/layouts/grid.layout/grid.layout.scss +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss @@ -1,5 +1,47 @@ @import "/src/shared/style/colors.scss"; +.custom-resize-handle { + position: absolute; + right: 0; + bottom: 0; + width: 20px; + height: 20px; + cursor: se-resize; + + .resize-handle-inner { + position: absolute; + right: 4px; + bottom: 4px; + width: 12px; + height: 12px; + border-right: 2px solid rgba(0, 0, 0, 0.2); + border-bottom: 2px solid rgba(0, 0, 0, 0.2); + } +} + +.react-grid-item { + transition: none !important; + + &.resizing { + z-index: 1; + will-change: transform; + } +} + +.react-grid-item { + height: 100px; + /* Hide resize handle by default */ + .custom-resize-handle { + opacity: 0; + transition: opacity 0.2s ease-in-out; + } + + /* Show resize handle on container hover */ + &:hover .custom-resize-handle { + opacity: 1; + } +} + .drag-handle { position: absolute; top: 0; @@ -25,8 +67,6 @@ .react-grid-item { &.react-draggable-dragging { - z-index: 100; - .drag-handle { cursor: grabbing; } diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx index 694c74478..7ec2c4a51 100644 --- a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx @@ -1,19 +1,18 @@ import React, { ReactElement, useEffect, useRef, useState } from 'react'; -import { Responsive, WidthProvider } from 'react-grid-layout'; +import RGL, { WidthProvider } from "react-grid-layout"; + import 'react-grid-layout/css/styles.css'; import 'react-resizable/css/styles.css'; import './grid.layout.scss'; -const ResponsiveGridLayout = WidthProvider(Responsive); +const ResponsiveGridLayout = WidthProvider(RGL); interface GridLayoutProps { children: ReactElement; } -getComputedStyle const RowCount = 2; -const padding = 80; // in px - +const padding = 80; export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { const [rowHeight, setRowHeight] = useState<number>(0); @@ -21,81 +20,62 @@ export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { const [mounted, setMounted] = useState<boolean>(false); const containerRef = useRef<HTMLDivElement>(null); - const layouts = { - lg: [ - { i: 'device-list', x: 0, y: 0, w: 2, h: 1, minW: 1, minH: 1 }, - { i: 'device-metadata', x: 0, y: 1, w: 2, h: 1, minW: 1, minH: 1 }, - { i: 'device-details', x: 2, y: 0, w: 2, h: 2, minW: 1, minH: 1 } - ] - }; + const layouts = [ + { i: 'device-list', x: 0, y: 0, w: 2, h: 1, minW: 1, minH: 1 }, + { i: 'device-metadata', x: 0, y: 1, w: 2, h: 1, minW: 1, minH: 1 }, + { i: 'device-details', x: 3, y: 0, w: 2, h: 2, minW: 1, minH: 1 } + ]; const calcHeights = () => { const container = containerRef.current; if (!container) { - // Fallback to body height if container is not available const height = document.body.clientHeight * 0.7; setRowHeight(Math.floor(height / RowCount)); return; } - const { top } = container.getBoundingClientRect(); const height = document.body.clientHeight - (top + padding); setContainerHeight(height); setRowHeight(Math.floor(height / RowCount)); - console.log(Math.floor(height / RowCount)); - }; useEffect(() => { calcHeights(); - }, [containerRef.current]) + }, [containerRef.current]); useEffect(() => { setMounted(true); - - window.addEventListener('resize', calcHeights); return () => window.removeEventListener('resize', calcHeights); }, []); - const gridItems = React.Children.map(children.props.children, (child, index) => { - if (!React.isValidElement(child)) return null; - - return React.cloneElement(child, { - key: index === 0 ? 'device-list' : 'device-details', - 'data-grid': layouts.lg[index] - }); - }); - return ( <div ref={containerRef} style={{ display: mounted ? 'block' : 'none', - height: `${containerHeight}px` + height: `${containerHeight}px`, }} > <ResponsiveGridLayout - className="layout" - layouts={layouts} - breakpoints={{ lg: 996, sm: 480 }} - cols={{ lg: 4, sm: 3 }} + cols={5} + layout={layouts} maxRows={RowCount} rowHeight={rowHeight} margin={[20, 20]} draggableHandle=".drag-handle" isDraggable={true} isResizable={true} - preventCollision={true} - compactType={null} - useCSSTransforms={mounted} resizeHandles={['se']} - + useCSSTransforms={true} + resizeHandle={ + <div className="custom-resize-handle"> + <div className="resize-handle-inner" /> + </div> + } > - {gridItems} + {children.props.children} </ResponsiveGridLayout> </div> ); }; - -export default GridLayout; \ No newline at end of file -- GitLab From b81eed0a704af338aef86e564625b8ab5d268492 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 23 Jan 2025 01:00:37 +0100 Subject: [PATCH 66/78] (ui): refactor minor styles --- .../devices/reducer/plugin.reducer.ts | 99 ++++++++++++ .../src/components/devices/view/device.scss | 2 +- .../components/devices/view/device.view.tsx | 10 +- .../devices/view/subcomponent/modal.view.tsx | 141 ++++++++++++++++++ .../devices/view_model/modal.viewmodel.ts | 10 ++ .../src/i18n/locales/en/translations.json | 25 ++-- .../shared/components/box/gridBox.view.tsx | 8 +- .../json_viewer/view/json_viewer.scss | 2 +- .../json_viewer/view/json_viewer.view.tsx | 2 +- .../layouts/grid.layout/grid.layout.scss | 28 ---- .../protected.layout/protected.layout.scss | 2 +- react-ui/src/shared/style/colors.scss | 3 +- 12 files changed, 281 insertions(+), 51 deletions(-) create mode 100644 react-ui/src/components/devices/reducer/plugin.reducer.ts create mode 100644 react-ui/src/components/devices/view/subcomponent/modal.view.tsx create mode 100644 react-ui/src/components/devices/view_model/modal.viewmodel.ts diff --git a/react-ui/src/components/devices/reducer/plugin.reducer.ts b/react-ui/src/components/devices/reducer/plugin.reducer.ts new file mode 100644 index 000000000..1a09876fe --- /dev/null +++ b/react-ui/src/components/devices/reducer/plugin.reducer.ts @@ -0,0 +1,99 @@ +import { + NetworkelementFlattenedManagedNetworkElement, + NetworkelementManagedNetworkElement, + PndPrincipalNetworkDomain +} from '@api/api' +import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import { refreshUpdateTimer } from '@shared/reducer/routine.reducer' +import { Category, CategoryType } from '@shared/types/category.type' +import { REHYDRATE } from 'redux-persist' +import { RootState } from 'src/stores' +import '../routines/index' +import { startListening } from '/src/stores/middleware/listener.middleware' + +export type Device = NetworkelementFlattenedManagedNetworkElement + +interface SelectedObject { + device: Device + mne: NetworkelementManagedNetworkElement | null + json: JSON | null +} + +export interface DeviceSliceState { + devices: Device[] + pnds: PndPrincipalNetworkDomain[] + + selected: SelectedObject | null +} + +const initialState: DeviceSliceState = { + plugins: [], +} + +interface SetSelectedDeviceType { + device: Device | null, + options?: { + bypassCheck: boolean + } +} + +const deviceSlice = createSlice({ + name: 'plugins', + initialState, + reducers: { + setPlugins: (state, action: PayloadAction<Plugin[] | undefined>) => { + state.devices = action.payload || [] + }, + }, +}) + +export const { setDevices, setSelectedDevice, setSelectedMne, setSelectedJson, setPnds } = + deviceSlice.actions + +export default deviceSlice.reducer +export const deviceReducerPath = deviceSlice.reducerPath + +// add default selected device if no selected device is set +startListening({ + predicate: (action) => setDevices.match(action), + effect: async (action, listenerApi) => { + const { device: state } = listenerApi.getOriginalState() as RootState + if (state.selected) { + return + } + + // if there are no devices available do set null + const device = action.payload?.[0] || null + listenerApi.dispatch(setSelectedDevice({ device } as SetSelectedDeviceType)) + }, +}) + +startListening({ + predicate: (action) => setSelectedMne.match(action), + effect: async (action, listenerApi) => { + listenerApi.dispatch(refreshUpdateTimer(Category.TAB as CategoryType)) + }, +}) + +startListening({ + predicate: (action) => setDevices.match(action), + effect: async (action, listenerApi) => { + listenerApi.dispatch(refreshUpdateTimer(Category.DEVICE as CategoryType)) + }, +}) + +/** + * On startup reset the selected device + */ +startListening({ + predicate: ({ type }: any) => type === REHYDRATE, + effect: async (_, listenerApi) => { + const { device: state } = listenerApi.getState() as RootState + const device = state.selected?.device + if (!device) { + return + } + + listenerApi.dispatch(setSelectedDevice({ device, options: { bypassCheck: true } } as SetSelectedDeviceType)) + }, +}) \ No newline at end of file diff --git a/react-ui/src/components/devices/view/device.scss b/react-ui/src/components/devices/view/device.scss index bce275265..7358cdcf4 100755 --- a/react-ui/src/components/devices/view/device.scss +++ b/react-ui/src/components/devices/view/device.scss @@ -6,7 +6,7 @@ } & tr:hover > td { - background-color: map-get($theme-colors, "primary::hover"); + background-color: map-get($theme-colors, "primary-hover"); cursor: pointer; } diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 636991ff1..290697ac6 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,4 +1,4 @@ -import { faPlus } from '@fortawesome/free-solid-svg-icons'; +import { faCircleInfo, faPlus, faServer, faSliders } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { GridLayout } from '@layout/grid.layout/grid.layout'; import { GridBox } from '@shared/components/box/gridBox.view'; @@ -20,7 +20,7 @@ const DeviceView = () => { <GridLayout> <> <div key="device-list"> - <GridBox title={t("device.title")}> + <GridBox title={t("device.box.list.title")} title_icon={faServer}> <Row className="mb-3 align-items-center"> <Col xs={12} md={6} lg={8}> <Form.Group controlId='device.search'> @@ -28,7 +28,7 @@ const DeviceView = () => { </Form.Group> </Col> <Col xs={12} md={6} lg={4} className='mt-3 mt-md-0 text-md-end'> - <Button variant='primary'> + <Button variant='primary::button' className='btn-primary-button'> <FontAwesomeIcon icon={faPlus} className='me-2' /> {t('device.add_device_button')} </Button> @@ -43,7 +43,7 @@ const DeviceView = () => { </div> <div key="device-metadata"> - <GridBox title={t("device.title")}> + <GridBox title={t("device.box.information.title")} title_icon={faCircleInfo}> <Row> <Col xs={12} > <DeviceListCollapsable search={searchRef.current?.value || ''} /> @@ -53,7 +53,7 @@ const DeviceView = () => { </div> <div key="device-details"> - <GridBox title={t('device.tabs.yang_model.title')}> + <GridBox title={t('device.box.configuration.title')} title_icon={faSliders}> <Row> <Col xs={12}> {jsonYang && <JsonViewer json={jsonYang} />} diff --git a/react-ui/src/components/devices/view/subcomponent/modal.view.tsx b/react-ui/src/components/devices/view/subcomponent/modal.view.tsx new file mode 100644 index 000000000..d798e7ade --- /dev/null +++ b/react-ui/src/components/devices/view/subcomponent/modal.view.tsx @@ -0,0 +1,141 @@ +import { NetworkelementAddListRequest, useNetworkElementServiceAddListMutation } from '@api/api'; +import React, { useState } from 'react'; +import { Button, Form, Modal } from 'react-bootstrap'; + +interface AddDeviceModalProps { + show: boolean; + onHide: () => void; +} + +interface FormData { + address: '', + mneName: '', + transportOption: undefined, + gnmiSubscribePaths: [], +} + +const AddDeviceModal: React.FC<AddDeviceModalProps> = ({ show, onHide }) => { + const [addNetworkElement] = useNetworkElementServiceAddListMutation(); + const [formData, setFormData] = useState<FormData>({ + address: '', + mneName: '', + transportOption: undefined, + gnmiSubscribePaths: [], + }); + + const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => { + const { name, value } = e.target; + setFormData(prev => ({ + ...prev, + [name]: value + })); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + const request: NetworkelementAddListRequest = { + timestamp: Date.now().toString(), // Convert to nanoseconds if needed + mne: [formData], + pid: formData.pid + }; + + try { + await addNetworkElement({ networkelementAddListRequest: request }); + handleReset(); + // You might want to add a success notification here + } catch (error) { + console.error('Failed to add device:', error); + // You might want to add an error notification here + } + }; + + const handleReset = () => { + setFormData({ + address: '', + pid: '', + pluginId: '', + mneName: '', + transportOption: undefined, + gnmiSubscribePaths: [], + mneId: '' + }); + onHide(); + }; + + return ( + <Modal show={show} onHide={handleReset} centered> + <Modal.Header closeButton> + <Modal.Title>Add New Device</Modal.Title> + </Modal.Header> + <Form onSubmit={handleSubmit}> + <Modal.Body> + <Form.Group className="mb-3"> + <Form.Label>Address</Form.Label> + <Form.Control + type="text" + name="address" + value={formData.address} + onChange={handleInputChange} + placeholder="Enter device address" + /> + </Form.Group> + + <Form.Group className="mb-3"> + <Form.Label>PID</Form.Label> + <Form.Control + type="text" + name="pid" + value={formData.pid} + onChange={handleInputChange} + placeholder="Enter PID" + /> + </Form.Group> + + <Form.Group className="mb-3"> + <Form.Label>Plugin ID</Form.Label> + <Form.Control + type="text" + name="pluginId" + value={formData.pluginId} + onChange={handleInputChange} + placeholder="Enter plugin ID" + /> + </Form.Group> + + <Form.Group className="mb-3"> + <Form.Label>MNE Name</Form.Label> + <Form.Control + type="text" + name="mneName" + value={formData.mneName} + onChange={handleInputChange} + placeholder="Enter MNE name" + /> + </Form.Group> + + <Form.Group className="mb-3"> + <Form.Label>MNE ID</Form.Label> + <Form.Control + type="text" + name="mneId" + value={formData.mneId} + onChange={handleInputChange} + placeholder="Enter MNE ID" + /> + </Form.Group> + </Modal.Body> + <Modal.Footer> + <Button variant="secondary" onClick={handleReset}> + Cancel + </Button> + <Button variant="primary" type="submit"> + Add Device + </Button> + </Modal.Footer> + </Form> + </Modal> + ); +}; + +export default AddDeviceModal; \ No newline at end of file diff --git a/react-ui/src/components/devices/view_model/modal.viewmodel.ts b/react-ui/src/components/devices/view_model/modal.viewmodel.ts new file mode 100644 index 000000000..de9bbf68e --- /dev/null +++ b/react-ui/src/components/devices/view_model/modal.viewmodel.ts @@ -0,0 +1,10 @@ +import { useEffect } from "react" + + +export const useModalViewModel = () => { + + + useEffect(() => { + + }, []) +} \ No newline at end of file diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index e23061744..92fb59d85 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -11,6 +11,9 @@ }, "menu_item": { "logout": "Logout" + }, + "box": { + "lastUpdate": "Last updated {{seconds}} seconds ago" } }, "json_viewer": { @@ -29,7 +32,17 @@ } }, "device": { - "title": "Device list", + "box": { + "list": { + "title": "Devices" + }, + "information": { + "title": "Information" + }, + "configuration": { + "title": "Configuration" + } + }, "table": { "header": { "name": "Name", @@ -45,15 +58,7 @@ "search": { "placeholder": "Search" }, - "add_device_button": "Add device", - "tabs": { - "yang_model": { - "title": "YANG Model" - } - }, - "box": { - "lastUpdate": "Last updated {{seconds}} seconds ago" - } + "add_device_button": "Add device" }, "protected": { "link": { diff --git a/react-ui/src/shared/components/box/gridBox.view.tsx b/react-ui/src/shared/components/box/gridBox.view.tsx index 77bed3913..cc8876100 100644 --- a/react-ui/src/shared/components/box/gridBox.view.tsx +++ b/react-ui/src/shared/components/box/gridBox.view.tsx @@ -1,4 +1,4 @@ -import { faGripVertical } from "@fortawesome/free-solid-svg-icons" +import { faGripVertical, IconDefinition } from "@fortawesome/free-solid-svg-icons" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" import UpdateIndicator from "@layout/grid.layout/update-inidicator.layout/update-indicator.layout" import { Category, CategoryType } from "@shared/types/category.type" @@ -7,12 +7,13 @@ import './gridBox.view.scss' interface GridBoxProps { title: string, + title_icon: IconDefinition, children: React.ReactNode, className?: string, } -export const GridBox: React.FC<GridBoxProps> = ({ children, title, className = "" }) => { +export const GridBox: React.FC<GridBoxProps> = ({ children, title, title_icon, className = "" }) => { return ( <div className="grid-box h-100"> <Container fluid className={`c-box d-flex flex-column h-100 ${className}`}> @@ -24,7 +25,8 @@ export const GridBox: React.FC<GridBoxProps> = ({ children, title, className = " <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> <Row className="mb-0"> <Col xs={12}> - <h4 className='c-box-title'>{title}</h4> + + <h4 className='c-box-title'><FontAwesomeIcon icon={title_icon} size="1x" className="me-2 text-primary" />{title}</h4> </Col> </Row> </div> diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss index 8a9a78ae5..b971de526 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss @@ -13,7 +13,7 @@ } &:hover > td { - background-color: map-get($theme-colors, "primary::hover") !important; + background-color: map-get($theme-colors, "primary-hover") !important; } &:hover .icons { diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index 68f0d6098..b2f409c17 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -29,7 +29,7 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr path += parentKey + (parentKey === "" ? "" : "/") if (Object.entries(innerJson).length === 0) { - return <Skeleton count={3}></Skeleton> + return <tr><td><Skeleton count={3}></Skeleton></td></tr> } return Object.entries(innerJson).map(([key, child]): JSX.Element => { diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.scss b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss index 81ed130dd..0bacb29b5 100644 --- a/react-ui/src/shared/layouts/grid.layout/grid.layout.scss +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.scss @@ -20,8 +20,6 @@ } .react-grid-item { - transition: none !important; - &.resizing { z-index: 1; will-change: transform; @@ -29,14 +27,11 @@ } .react-grid-item { - height: 100px; - /* Hide resize handle by default */ .custom-resize-handle { opacity: 0; transition: opacity 0.2s ease-in-out; } - /* Show resize handle on container hover */ &:hover .custom-resize-handle { opacity: 1; } @@ -65,14 +60,6 @@ } } -.react-grid-item { - &.react-draggable-dragging { - .drag-handle { - cursor: grabbing; - } - } -} - .react-grid-item.react-grid-placeholder { background: lighten(map-get($theme-colors, primary), 10%) !important; opacity: 0.2; @@ -86,21 +73,6 @@ user-select: none; } -.react-grid-item { - height: 100px; - /* Hide resize handle by default */ - .react-resizable-handle-se { - opacity: 0; - transition: opacity 0.2s ease-in-out; - } - - /* Show resize handle on container hover */ - &:hover .react-resizable-handle-se { - opacity: 1; - } -} - -/* Style the resize handle */ .react-resizable-handle-se { position: absolute; right: 0; diff --git a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss index 52429031b..6f255d331 100755 --- a/react-ui/src/shared/layouts/protected.layout/protected.layout.scss +++ b/react-ui/src/shared/layouts/protected.layout/protected.layout.scss @@ -39,7 +39,7 @@ nav { &.active { color: map-get($theme-colors, "primary"); - background-color: map-get($theme-colors, "primary::hover"); + background-color: map-get($theme-colors, "primary-button"); } } diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss index ce3c3cf90..9ba6ce0c0 100755 --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -1,6 +1,7 @@ $theme-colors: ( "primary": #b350e0, - "primary::hover": #ddaff3af, + "primary-hover": #ddaff3af, + "primary-button": #ddaff3af, "bg-primary": #ededed, "danger": #ff0000, "warning": #dbd116, -- GitLab From 692ede47ec1c21f25332f577c16a66954b6c3577 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Wed, 5 Feb 2025 13:00:25 +0100 Subject: [PATCH 67/78] (ui): added pluing fetch endpoint --- .../gnmi/proto/collector/collector.pb.go | 25 +- .../openconfig/gnmi/proto/gnmi/gnmi.pb.go | 426 ++++++------ .../gnmi/proto/gnmi_ext/gnmi_ext.pb.go | 121 ++-- .../openconfig/gnmi/proto/target/target.pb.go | 49 +- .../gnmi/testing/fake/proto/fake.pb.go | 397 ++++++----- api/go/gosdn/app/app.pb.go | 52 +- api/go/gosdn/app/app.pb.gw.go | 104 ++- .../configurationmanagement.pb.go | 50 +- .../configurationmanagement.pb.gw.go | 130 +--- api/go/gosdn/conflict/conflict.pb.go | 23 +- api/go/gosdn/csbi/csbi.pb.go | 113 ++- .../gosdn/networkelement/networkelement.pb.go | 421 ++++++------ .../networkelement/networkelement.pb.gw.go | 648 +++++------------- .../plugin-internal/plugin-internal.pb.go | 233 ++++--- .../plugin-internal/plugin-internal.pb.gw.go | 162 +++++ .../plugin-internal_grpc.pb.go | 42 +- .../plugin-registry/plugin-registry.pb.go | 379 ++++++---- .../plugin-registry/plugin-registry.pb.gw.go | 162 +++++ api/go/gosdn/plugin/plugin.pb.go | 558 ++++++++------- api/go/gosdn/plugin/plugin.pb.gw.go | 162 +++++ api/go/gosdn/plugin/plugin_grpc.pb.go | 57 +- api/go/gosdn/pnd/pnd.pb.go | 100 ++- api/go/gosdn/pnd/pnd.pb.gw.go | 226 ++---- api/go/gosdn/rbac/rbac.pb.go | 50 +- api/go/gosdn/rbac/rbac.pb.gw.go | 120 ++-- api/go/gosdn/rbac/role.pb.go | 131 ++-- api/go/gosdn/rbac/role.pb.gw.go | 288 +++----- api/go/gosdn/rbac/user.pb.go | 132 ++-- api/go/gosdn/rbac/user.pb.gw.go | 234 +++---- api/go/gosdn/southbound/southbound.pb.go | 41 +- .../subscriptionmanagement.pb.go | 135 ++-- .../subscriptionmanagement.pb.gw.go | 296 +++----- api/go/gosdn/topology/link.pb.go | 33 +- api/go/gosdn/topology/node.pb.go | 25 +- api/go/gosdn/topology/port.pb.go | 36 +- api/go/gosdn/topology/route.pb.go | 42 +- api/go/gosdn/topology/routingTable.pb.go | 62 +- api/go/gosdn/topology/routingTable.pb.gw.go | 150 ++-- api/go/gosdn/topology/topology.pb.go | 85 +-- api/go/gosdn/topology/topology.pb.gw.go | 196 ++---- api/go/gosdn/transport/transport.pb.go | 68 +- api/openapiv2/gosdn_northbound.swagger.json | 31 + .../gosdn/networkelement/networkelement.proto | 2 +- .../plugin-internal/plugin-internal.proto | 15 +- .../plugin-registry/plugin-registry.proto | 11 + api/proto/gosdn/plugin/plugin.proto | 8 + controller/controller.go | 1 + controller/http.go | 6 + controller/northbound/server/plugin.go | 16 + .../src/components/login/view/login.view.tsx | 2 +- 50 files changed, 3348 insertions(+), 3508 deletions(-) create mode 100644 api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go create mode 100644 api/go/gosdn/plugin-registry/plugin-registry.pb.gw.go create mode 100644 api/go/gosdn/plugin/plugin.pb.gw.go diff --git a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go index 09e16b605..3eba4d236 100755 --- a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/collector/collector.proto @@ -27,6 +27,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -37,11 +38,10 @@ const ( ) type ReconnectRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Target []string `protobuf:"bytes,1,rep,name=target,proto3" json:"target,omitempty"` // List of targets to reconnect. unknownFields protoimpl.UnknownFields - - Target []string `protobuf:"bytes,1,rep,name=target,proto3" json:"target,omitempty"` // List of targets to reconnect. + sizeCache protoimpl.SizeCache } func (x *ReconnectRequest) Reset() { @@ -82,9 +82,9 @@ func (x *ReconnectRequest) GetTarget() []string { } type Nil struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Nil) Reset() { @@ -119,7 +119,7 @@ func (*Nil) Descriptor() ([]byte, []int) { var File_github_com_openconfig_gnmi_proto_collector_collector_proto protoreflect.FileDescriptor -var file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc = []byte{ +var file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc = string([]byte{ 0x0a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x6f, 0x6c, @@ -135,16 +135,16 @@ var file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc = [] 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x3b, 0x67, 0x6e, 0x6d, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescOnce sync.Once - file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescData = file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc + file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescData []byte ) func file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescGZIP() []byte { file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescOnce.Do(func() { - file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescData) + file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc))) }) return file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDescData } @@ -173,7 +173,7 @@ func file_github_com_openconfig_gnmi_proto_collector_collector_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc)), NumEnums: 0, NumMessages: 2, NumExtensions: 0, @@ -184,7 +184,6 @@ func file_github_com_openconfig_gnmi_proto_collector_collector_proto_init() { MessageInfos: file_github_com_openconfig_gnmi_proto_collector_collector_proto_msgTypes, }.Build() File_github_com_openconfig_gnmi_proto_collector_collector_proto = out.File - file_github_com_openconfig_gnmi_proto_collector_collector_proto_rawDesc = nil file_github_com_openconfig_gnmi_proto_collector_collector_proto_goTypes = nil file_github_com_openconfig_gnmi_proto_collector_collector_proto_depIdxs = nil } diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go index d0162888f..0d1e241b0 100755 --- a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/gnmi/gnmi.proto @@ -39,6 +39,7 @@ import ( anypb "google.golang.org/protobuf/types/known/anypb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -329,12 +330,9 @@ func (GetRequest_DataType) EnumDescriptor() ([]byte, []int) { // // Reference: gNMI Specification Section 2.1 type Notification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Prefix *Path `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths in the message. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Prefix *Path `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths in the message. // An alias for the path specified in the prefix field. // Reference: gNMI Specification Section 2.4.2 Alias string `protobuf:"bytes,3,opt,name=alias,proto3" json:"alias,omitempty"` @@ -342,7 +340,9 @@ type Notification struct { Delete []*Path `protobuf:"bytes,5,rep,name=delete,proto3" json:"delete,omitempty"` // Data elements that have been deleted. // This notification contains a set of paths that are always updated together // referenced by a globally unique prefix. - Atomic bool `protobuf:"varint,6,opt,name=atomic,proto3" json:"atomic,omitempty"` + Atomic bool `protobuf:"varint,6,opt,name=atomic,proto3" json:"atomic,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Notification) Reset() { @@ -421,15 +421,14 @@ func (x *Notification) GetAtomic() bool { // Value pair. // Reference: gNMI Specification Section 2.1 type Update struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path *Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // The path (key) for the update. + state protoimpl.MessageState `protogen:"open.v1"` + Path *Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // The path (key) for the update. // Deprecated: Marked as deprecated in github.com/openconfig/gnmi/proto/gnmi/gnmi.proto. - Value *Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // The value (value) for the update. - Val *TypedValue `protobuf:"bytes,3,opt,name=val,proto3" json:"val,omitempty"` // The explicitly typed update value. - Duplicates uint32 `protobuf:"varint,4,opt,name=duplicates,proto3" json:"duplicates,omitempty"` // Number of coalesced duplicates. + Value *Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // The value (value) for the update. + Val *TypedValue `protobuf:"bytes,3,opt,name=val,proto3" json:"val,omitempty"` // The explicitly typed update value. + Duplicates uint32 `protobuf:"varint,4,opt,name=duplicates,proto3" json:"duplicates,omitempty"` // Number of coalesced duplicates. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Update) Reset() { @@ -494,17 +493,14 @@ func (x *Update) GetDuplicates() uint32 { // TypedValue is used to encode a value being sent between the client and // target (originated by either entity). type TypedValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // One of the fields within the val oneof is populated with the value // of the update. The type of the value being included in the Update // determines which field should be populated. In the case that the // encoding is a particular form of the base protobuf type, a specific // field is used to store the value (e.g., json_val). // - // Types that are assignable to Value: + // Types that are valid to be assigned to Value: // // *TypedValue_StringVal // *TypedValue_IntVal @@ -519,7 +515,9 @@ type TypedValue struct { // *TypedValue_JsonIetfVal // *TypedValue_AsciiVal // *TypedValue_ProtoBytes - Value isTypedValue_Value `protobuf_oneof:"value"` + Value isTypedValue_Value `protobuf_oneof:"value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TypedValue) Reset() { @@ -552,100 +550,126 @@ func (*TypedValue) Descriptor() ([]byte, []int) { return file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescGZIP(), []int{2} } -func (m *TypedValue) GetValue() isTypedValue_Value { - if m != nil { - return m.Value +func (x *TypedValue) GetValue() isTypedValue_Value { + if x != nil { + return x.Value } return nil } func (x *TypedValue) GetStringVal() string { - if x, ok := x.GetValue().(*TypedValue_StringVal); ok { - return x.StringVal + if x != nil { + if x, ok := x.Value.(*TypedValue_StringVal); ok { + return x.StringVal + } } return "" } func (x *TypedValue) GetIntVal() int64 { - if x, ok := x.GetValue().(*TypedValue_IntVal); ok { - return x.IntVal + if x != nil { + if x, ok := x.Value.(*TypedValue_IntVal); ok { + return x.IntVal + } } return 0 } func (x *TypedValue) GetUintVal() uint64 { - if x, ok := x.GetValue().(*TypedValue_UintVal); ok { - return x.UintVal + if x != nil { + if x, ok := x.Value.(*TypedValue_UintVal); ok { + return x.UintVal + } } return 0 } func (x *TypedValue) GetBoolVal() bool { - if x, ok := x.GetValue().(*TypedValue_BoolVal); ok { - return x.BoolVal + if x != nil { + if x, ok := x.Value.(*TypedValue_BoolVal); ok { + return x.BoolVal + } } return false } func (x *TypedValue) GetBytesVal() []byte { - if x, ok := x.GetValue().(*TypedValue_BytesVal); ok { - return x.BytesVal + if x != nil { + if x, ok := x.Value.(*TypedValue_BytesVal); ok { + return x.BytesVal + } } return nil } func (x *TypedValue) GetFloatVal() float32 { - if x, ok := x.GetValue().(*TypedValue_FloatVal); ok { - return x.FloatVal + if x != nil { + if x, ok := x.Value.(*TypedValue_FloatVal); ok { + return x.FloatVal + } } return 0 } func (x *TypedValue) GetDecimalVal() *Decimal64 { - if x, ok := x.GetValue().(*TypedValue_DecimalVal); ok { - return x.DecimalVal + if x != nil { + if x, ok := x.Value.(*TypedValue_DecimalVal); ok { + return x.DecimalVal + } } return nil } func (x *TypedValue) GetLeaflistVal() *ScalarArray { - if x, ok := x.GetValue().(*TypedValue_LeaflistVal); ok { - return x.LeaflistVal + if x != nil { + if x, ok := x.Value.(*TypedValue_LeaflistVal); ok { + return x.LeaflistVal + } } return nil } func (x *TypedValue) GetAnyVal() *anypb.Any { - if x, ok := x.GetValue().(*TypedValue_AnyVal); ok { - return x.AnyVal + if x != nil { + if x, ok := x.Value.(*TypedValue_AnyVal); ok { + return x.AnyVal + } } return nil } func (x *TypedValue) GetJsonVal() []byte { - if x, ok := x.GetValue().(*TypedValue_JsonVal); ok { - return x.JsonVal + if x != nil { + if x, ok := x.Value.(*TypedValue_JsonVal); ok { + return x.JsonVal + } } return nil } func (x *TypedValue) GetJsonIetfVal() []byte { - if x, ok := x.GetValue().(*TypedValue_JsonIetfVal); ok { - return x.JsonIetfVal + if x != nil { + if x, ok := x.Value.(*TypedValue_JsonIetfVal); ok { + return x.JsonIetfVal + } } return nil } func (x *TypedValue) GetAsciiVal() string { - if x, ok := x.GetValue().(*TypedValue_AsciiVal); ok { - return x.AsciiVal + if x != nil { + if x, ok := x.Value.(*TypedValue_AsciiVal); ok { + return x.AsciiVal + } } return "" } func (x *TypedValue) GetProtoBytes() []byte { - if x, ok := x.GetValue().(*TypedValue_ProtoBytes); ok { - return x.ProtoBytes + if x != nil { + if x, ok := x.Value.(*TypedValue_ProtoBytes); ok { + return x.ProtoBytes + } } return nil } @@ -741,18 +765,17 @@ func (*TypedValue_ProtoBytes) isTypedValue_Value() {} // associated attributes. // Reference: gNMI Specification Section 2.2.2. type Path struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Elements of the path are no longer encoded as a string, but rather within // the elem field as a PathElem message. // // Deprecated: Marked as deprecated in github.com/openconfig/gnmi/proto/gnmi/gnmi.proto. - Element []string `protobuf:"bytes,1,rep,name=element,proto3" json:"element,omitempty"` - Origin string `protobuf:"bytes,2,opt,name=origin,proto3" json:"origin,omitempty"` // Label to disambiguate path. - Elem []*PathElem `protobuf:"bytes,3,rep,name=elem,proto3" json:"elem,omitempty"` // Elements of the path. - Target string `protobuf:"bytes,4,opt,name=target,proto3" json:"target,omitempty"` // The name of the target + Element []string `protobuf:"bytes,1,rep,name=element,proto3" json:"element,omitempty"` + Origin string `protobuf:"bytes,2,opt,name=origin,proto3" json:"origin,omitempty"` // Label to disambiguate path. + Elem []*PathElem `protobuf:"bytes,3,rep,name=elem,proto3" json:"elem,omitempty"` // Elements of the path. + Target string `protobuf:"bytes,4,opt,name=target,proto3" json:"target,omitempty"` // The name of the target + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Path) Reset() { @@ -818,12 +841,11 @@ func (x *Path) GetTarget() string { // that may be associated with it. // Reference: gNMI Specification Section 2.2.2. type PathElem struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The name of the element in the path. + Key map[string]string `protobuf:"bytes,2,rep,name=key,proto3" json:"key,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Map of key (attribute) name to value. unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The name of the element in the path. - Key map[string]string `protobuf:"bytes,2,rep,name=key,proto3" json:"key,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of key (attribute) name to value. + sizeCache protoimpl.SizeCache } func (x *PathElem) Reset() { @@ -876,12 +898,11 @@ func (x *PathElem) GetKey() map[string]string { // // Deprecated: Marked as deprecated in github.com/openconfig/gnmi/proto/gnmi/gnmi.proto. type Value struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // Value of the variable being transmitted. + Type Encoding `protobuf:"varint,2,opt,name=type,proto3,enum=gnmi.Encoding" json:"type,omitempty"` // Encoding used for the value field. unknownFields protoimpl.UnknownFields - - Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // Value of the variable being transmitted. - Type Encoding `protobuf:"varint,2,opt,name=type,proto3,enum=gnmi.Encoding" json:"type,omitempty"` // Encoding used for the value field. + sizeCache protoimpl.SizeCache } func (x *Value) Reset() { @@ -935,13 +956,12 @@ func (x *Value) GetType() Encoding { // // Deprecated: Marked as deprecated in github.com/openconfig/gnmi/proto/gnmi/gnmi.proto. type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // Canonical gRPC error code. + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` // Human readable error. + Data *anypb.Any `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // Optional additional information. unknownFields protoimpl.UnknownFields - - Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // Canonical gRPC error code. - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` // Human readable error. - Data *anypb.Any `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // Optional additional information. + sizeCache protoimpl.SizeCache } func (x *Error) Reset() { @@ -999,12 +1019,11 @@ func (x *Error) GetData() *anypb.Any { // is expressed as a set of digits with the precision specifying the // number of digits following the decimal point in the digit set. type Decimal64 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Digits int64 `protobuf:"varint,1,opt,name=digits,proto3" json:"digits,omitempty"` // Set of digits. + Precision uint32 `protobuf:"varint,2,opt,name=precision,proto3" json:"precision,omitempty"` // Number of digits following the decimal point. unknownFields protoimpl.UnknownFields - - Digits int64 `protobuf:"varint,1,opt,name=digits,proto3" json:"digits,omitempty"` // Set of digits. - Precision uint32 `protobuf:"varint,2,opt,name=precision,proto3" json:"precision,omitempty"` // Number of digits following the decimal point. + sizeCache protoimpl.SizeCache } func (x *Decimal64) Reset() { @@ -1053,14 +1072,13 @@ func (x *Decimal64) GetPrecision() uint32 { // ScalarArray is used to encode a mixed-type array of values. type ScalarArray struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The set of elements within the array. Each TypedValue message should // specify only elements that have a field identifier of 1-7 (i.e., the // values are scalar values). - Element []*TypedValue `protobuf:"bytes,1,rep,name=element,proto3" json:"element,omitempty"` + Element []*TypedValue `protobuf:"bytes,1,rep,name=element,proto3" json:"element,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ScalarArray) Reset() { @@ -1107,11 +1125,8 @@ func (x *ScalarArray) GetElement() []*TypedValue { // used to define aliases or trigger polled data to be sent by the target. // Reference: gNMI Specification Section 3.5.1.1 type SubscribeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Request: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Request: // // *SubscribeRequest_Subscribe // *SubscribeRequest_Poll @@ -1119,7 +1134,9 @@ type SubscribeRequest struct { Request isSubscribeRequest_Request `protobuf_oneof:"request"` // Extension messages associated with the SubscribeRequest. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SubscribeRequest) Reset() { @@ -1152,30 +1169,36 @@ func (*SubscribeRequest) Descriptor() ([]byte, []int) { return file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescGZIP(), []int{9} } -func (m *SubscribeRequest) GetRequest() isSubscribeRequest_Request { - if m != nil { - return m.Request +func (x *SubscribeRequest) GetRequest() isSubscribeRequest_Request { + if x != nil { + return x.Request } return nil } func (x *SubscribeRequest) GetSubscribe() *SubscriptionList { - if x, ok := x.GetRequest().(*SubscribeRequest_Subscribe); ok { - return x.Subscribe + if x != nil { + if x, ok := x.Request.(*SubscribeRequest_Subscribe); ok { + return x.Subscribe + } } return nil } func (x *SubscribeRequest) GetPoll() *Poll { - if x, ok := x.GetRequest().(*SubscribeRequest_Poll); ok { - return x.Poll + if x != nil { + if x, ok := x.Request.(*SubscribeRequest_Poll); ok { + return x.Poll + } } return nil } func (x *SubscribeRequest) GetAliases() *AliasList { - if x, ok := x.GetRequest().(*SubscribeRequest_Aliases); ok { - return x.Aliases + if x != nil { + if x, ok := x.Request.(*SubscribeRequest_Aliases); ok { + return x.Aliases + } } return nil } @@ -1214,9 +1237,9 @@ func (*SubscribeRequest_Aliases) isSubscribeRequest_Request() {} // subscription. // Reference: gNMI Specification Section Section 3.5.1.4 type Poll struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Poll) Reset() { @@ -1256,11 +1279,8 @@ func (*Poll) Descriptor() ([]byte, []int) { // synchronized). // Reference: gNMI Specification Section 3.5.1.4 type SubscribeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Response: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Response: // // *SubscribeResponse_Update // *SubscribeResponse_SyncResponse @@ -1268,7 +1288,9 @@ type SubscribeResponse struct { Response isSubscribeResponse_Response `protobuf_oneof:"response"` // Extension messages associated with the SubscribeResponse. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SubscribeResponse) Reset() { @@ -1301,31 +1323,37 @@ func (*SubscribeResponse) Descriptor() ([]byte, []int) { return file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescGZIP(), []int{11} } -func (m *SubscribeResponse) GetResponse() isSubscribeResponse_Response { - if m != nil { - return m.Response +func (x *SubscribeResponse) GetResponse() isSubscribeResponse_Response { + if x != nil { + return x.Response } return nil } func (x *SubscribeResponse) GetUpdate() *Notification { - if x, ok := x.GetResponse().(*SubscribeResponse_Update); ok { - return x.Update + if x != nil { + if x, ok := x.Response.(*SubscribeResponse_Update); ok { + return x.Update + } } return nil } func (x *SubscribeResponse) GetSyncResponse() bool { - if x, ok := x.GetResponse().(*SubscribeResponse_SyncResponse); ok { - return x.SyncResponse + if x != nil { + if x, ok := x.Response.(*SubscribeResponse_SyncResponse); ok { + return x.SyncResponse + } } return false } // Deprecated: Marked as deprecated in github.com/openconfig/gnmi/proto/gnmi/gnmi.proto. func (x *SubscribeResponse) GetError() *Error { - if x, ok := x.GetResponse().(*SubscribeResponse_Error); ok { - return x.Error + if x != nil { + if x, ok := x.Response.(*SubscribeResponse_Error); ok { + return x.Error + } } return nil } @@ -1370,12 +1398,9 @@ func (*SubscribeResponse_Error) isSubscribeResponse_Response() {} // subscription. // Reference: gNMI Specification Section 3.5.1.2 type SubscriptionList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths. - Subscription []*Subscription `protobuf:"bytes,2,rep,name=subscription,proto3" json:"subscription,omitempty"` // Set of subscriptions to create. + state protoimpl.MessageState `protogen:"open.v1"` + Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths. + Subscription []*Subscription `protobuf:"bytes,2,rep,name=subscription,proto3" json:"subscription,omitempty"` // Set of subscriptions to create. // Whether target defined aliases are allowed within the subscription. UseAliases bool `protobuf:"varint,3,opt,name=use_aliases,json=useAliases,proto3" json:"use_aliases,omitempty"` Qos *QOSMarking `protobuf:"bytes,4,opt,name=qos,proto3" json:"qos,omitempty"` // DSCP marking to be used. @@ -1394,7 +1419,9 @@ type SubscriptionList struct { // rather only the sync message followed by any subsequent updates to the // current state. For ONCE and POLL modes, this causes the server to send only // the sync message (Sec. 3.5.2.3). - UpdatesOnly bool `protobuf:"varint,9,opt,name=updates_only,json=updatesOnly,proto3" json:"updates_only,omitempty"` + UpdatesOnly bool `protobuf:"varint,9,opt,name=updates_only,json=updatesOnly,proto3" json:"updates_only,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SubscriptionList) Reset() { @@ -1496,13 +1523,10 @@ func (x *SubscriptionList) GetUpdatesOnly() bool { // should trigger updates to be sent. // Reference: gNMI Specification Section 3.5.1.3 type Subscription struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path *Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // The data tree path. - Mode SubscriptionMode `protobuf:"varint,2,opt,name=mode,proto3,enum=gnmi.SubscriptionMode" json:"mode,omitempty"` // Subscription mode to be used. - SampleInterval uint64 `protobuf:"varint,3,opt,name=sample_interval,json=sampleInterval,proto3" json:"sample_interval,omitempty"` // ns between samples in SAMPLE mode. + state protoimpl.MessageState `protogen:"open.v1"` + Path *Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // The data tree path. + Mode SubscriptionMode `protobuf:"varint,2,opt,name=mode,proto3,enum=gnmi.SubscriptionMode" json:"mode,omitempty"` // Subscription mode to be used. + SampleInterval uint64 `protobuf:"varint,3,opt,name=sample_interval,json=sampleInterval,proto3" json:"sample_interval,omitempty"` // ns between samples in SAMPLE mode. // Indicates whether values that have not changed should be sent in a SAMPLE // subscription. SuppressRedundant bool `protobuf:"varint,4,opt,name=suppress_redundant,json=suppressRedundant,proto3" json:"suppress_redundant,omitempty"` @@ -1510,6 +1534,8 @@ type Subscription struct { // suppress_redundant is in use. The target should send a value at least once // in the period specified. HeartbeatInterval uint64 `protobuf:"varint,5,opt,name=heartbeat_interval,json=heartbeatInterval,proto3" json:"heartbeat_interval,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Subscription) Reset() { @@ -1581,11 +1607,10 @@ func (x *Subscription) GetHeartbeatInterval() uint64 { // updates from the target. // Reference: gNMI Specification Section 3.5.1.2 type QOSMarking struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Marking uint32 `protobuf:"varint,1,opt,name=marking,proto3" json:"marking,omitempty"` unknownFields protoimpl.UnknownFields - - Marking uint32 `protobuf:"varint,1,opt,name=marking,proto3" json:"marking,omitempty"` + sizeCache protoimpl.SizeCache } func (x *QOSMarking) Reset() { @@ -1631,12 +1656,11 @@ func (x *QOSMarking) GetMarking() uint32 { // data tree element paths. // Reference: gNMI Specification Section 2.4.2 type Alias struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Path *Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // The path to be aliased. + Alias string `protobuf:"bytes,2,opt,name=alias,proto3" json:"alias,omitempty"` // The alias value, a string prefixed by "#". unknownFields protoimpl.UnknownFields - - Path *Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // The path to be aliased. - Alias string `protobuf:"bytes,2,opt,name=alias,proto3" json:"alias,omitempty"` // The alias value, a string prefixed by "#". + sizeCache protoimpl.SizeCache } func (x *Alias) Reset() { @@ -1687,11 +1711,10 @@ func (x *Alias) GetAlias() string { // a client to create a set of aliases that the target is to utilize. // Reference: gNMI Specification Section 3.5.1.6 type AliasList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Alias []*Alias `protobuf:"bytes,1,rep,name=alias,proto3" json:"alias,omitempty"` // The set of aliases to be created. unknownFields protoimpl.UnknownFields - - Alias []*Alias `protobuf:"bytes,1,rep,name=alias,proto3" json:"alias,omitempty"` // The set of aliases to be created. + sizeCache protoimpl.SizeCache } func (x *AliasList) Reset() { @@ -1739,17 +1762,16 @@ func (x *AliasList) GetAlias() []*Alias { // a single SetRequest are considered to be a transaction. // Reference: gNMI Specification Section 3.4.1 type SetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths in the message. - Delete []*Path `protobuf:"bytes,2,rep,name=delete,proto3" json:"delete,omitempty"` // Paths to be deleted from the data tree. - Replace []*Update `protobuf:"bytes,3,rep,name=replace,proto3" json:"replace,omitempty"` // Updates specifying elements to be replaced. - Update []*Update `protobuf:"bytes,4,rep,name=update,proto3" json:"update,omitempty"` // Updates specifying elements to updated. + state protoimpl.MessageState `protogen:"open.v1"` + Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths in the message. + Delete []*Path `protobuf:"bytes,2,rep,name=delete,proto3" json:"delete,omitempty"` // Paths to be deleted from the data tree. + Replace []*Update `protobuf:"bytes,3,rep,name=replace,proto3" json:"replace,omitempty"` // Updates specifying elements to be replaced. + Update []*Update `protobuf:"bytes,4,rep,name=update,proto3" json:"update,omitempty"` // Updates specifying elements to updated. // Extension messages associated with the SetRequest. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SetRequest) Reset() { @@ -1825,11 +1847,8 @@ func (x *SetRequest) GetExtension() []*gnmi_ext.Extension { // details where required. // Reference: gNMI Specification Section 3.4.2 type SetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths. + state protoimpl.MessageState `protogen:"open.v1"` + Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths. // A set of responses specifying the result of the operations specified in // the SetRequest. Response []*UpdateResult `protobuf:"bytes,2,rep,name=response,proto3" json:"response,omitempty"` @@ -1838,7 +1857,9 @@ type SetResponse struct { Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp of transaction (ns since epoch). // Extension messages associated with the SetResponse. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,5,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SetResponse) Reset() { @@ -1911,10 +1932,7 @@ func (x *SetResponse) GetExtension() []*gnmi_ext.Extension { // result of an operation specified within a SetRequest message. // Reference: gNMI Specification Section 3.4.2 type UpdateResult struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated timestamp for the UpdateResult, this field has been // replaced by the timestamp within the SetResponse message, since // all mutations effected by a set should be applied as a single @@ -1924,8 +1942,10 @@ type UpdateResult struct { Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Path *Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Path associated with the update. // Deprecated: Marked as deprecated in github.com/openconfig/gnmi/proto/gnmi/gnmi.proto. - Message *Error `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` // Status of the update operation. - Op UpdateResult_Operation `protobuf:"varint,4,opt,name=op,proto3,enum=gnmi.UpdateResult_Operation" json:"op,omitempty"` // Update operation type. + Message *Error `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` // Status of the update operation. + Op UpdateResult_Operation `protobuf:"varint,4,opt,name=op,proto3,enum=gnmi.UpdateResult_Operation" json:"op,omitempty"` // Update operation type. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateResult) Reset() { @@ -1995,18 +2015,17 @@ func (x *UpdateResult) GetOp() UpdateResult_Operation { // must use all schema models that it has. // Reference: gNMI Specification Section 3.3.1 type GetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths. - Path []*Path `protobuf:"bytes,2,rep,name=path,proto3" json:"path,omitempty"` // Paths requested by the client. - Type GetRequest_DataType `protobuf:"varint,3,opt,name=type,proto3,enum=gnmi.GetRequest_DataType" json:"type,omitempty"` // The type of data being requested. - Encoding Encoding `protobuf:"varint,5,opt,name=encoding,proto3,enum=gnmi.Encoding" json:"encoding,omitempty"` // Encoding to be used. - UseModels []*ModelData `protobuf:"bytes,6,rep,name=use_models,json=useModels,proto3" json:"use_models,omitempty"` // The schema models to be used. + state protoimpl.MessageState `protogen:"open.v1"` + Prefix *Path `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` // Prefix used for paths. + Path []*Path `protobuf:"bytes,2,rep,name=path,proto3" json:"path,omitempty"` // Paths requested by the client. + Type GetRequest_DataType `protobuf:"varint,3,opt,name=type,proto3,enum=gnmi.GetRequest_DataType" json:"type,omitempty"` // The type of data being requested. + Encoding Encoding `protobuf:"varint,5,opt,name=encoding,proto3,enum=gnmi.Encoding" json:"encoding,omitempty"` // Encoding to be used. + UseModels []*ModelData `protobuf:"bytes,6,rep,name=use_models,json=useModels,proto3" json:"use_models,omitempty"` // The schema models to be used. // Extension messages associated with the GetRequest. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,7,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,7,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetRequest) Reset() { @@ -2086,16 +2105,15 @@ func (x *GetRequest) GetExtension() []*gnmi_ext.Extension { // by the client in the GetRequest. // Reference: gNMI Specification Section 3.3.2 type GetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Notification []*Notification `protobuf:"bytes,1,rep,name=notification,proto3" json:"notification,omitempty"` // Data values. + state protoimpl.MessageState `protogen:"open.v1"` + Notification []*Notification `protobuf:"bytes,1,rep,name=notification,proto3" json:"notification,omitempty"` // Data values. // Deprecated: Marked as deprecated in github.com/openconfig/gnmi/proto/gnmi/gnmi.proto. Error *Error `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` // Errors that occurred in the Get. // Extension messages associated with the GetResponse. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,3,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,3,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetResponse) Reset() { @@ -2154,13 +2172,12 @@ func (x *GetResponse) GetExtension() []*gnmi_ext.Extension { // that the target reports its capabilities. // Reference: gNMI Specification Section 3.2.1 type CapabilityRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Extension messages associated with the CapabilityRequest. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,1,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,1,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CapabilityRequest) Reset() { @@ -2204,16 +2221,15 @@ func (x *CapabilityRequest) GetExtension() []*gnmi_ext.Extension { // client within the Capabilities RPC. // Reference: gNMI Specification Section 3.2.2 type CapabilityResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SupportedModels []*ModelData `protobuf:"bytes,1,rep,name=supported_models,json=supportedModels,proto3" json:"supported_models,omitempty"` // Supported schema models. - SupportedEncodings []Encoding `protobuf:"varint,2,rep,packed,name=supported_encodings,json=supportedEncodings,proto3,enum=gnmi.Encoding" json:"supported_encodings,omitempty"` // Supported encodings. - GNMIVersion string `protobuf:"bytes,3,opt,name=gNMI_version,json=gNMIVersion,proto3" json:"gNMI_version,omitempty"` // Supported gNMI version. + state protoimpl.MessageState `protogen:"open.v1"` + SupportedModels []*ModelData `protobuf:"bytes,1,rep,name=supported_models,json=supportedModels,proto3" json:"supported_models,omitempty"` // Supported schema models. + SupportedEncodings []Encoding `protobuf:"varint,2,rep,packed,name=supported_encodings,json=supportedEncodings,proto3,enum=gnmi.Encoding" json:"supported_encodings,omitempty"` // Supported encodings. + GNMIVersion string `protobuf:"bytes,3,opt,name=gNMI_version,json=gNMIVersion,proto3" json:"gNMI_version,omitempty"` // Supported gNMI version. // Extension messages associated with the CapabilityResponse. See the // gNMI extension specification for further definition. - Extension []*gnmi_ext.Extension `protobuf:"bytes,4,rep,name=extension,proto3" json:"extension,omitempty"` + Extension []*gnmi_ext.Extension `protobuf:"bytes,4,rep,name=extension,proto3" json:"extension,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CapabilityResponse) Reset() { @@ -2280,13 +2296,12 @@ func (x *CapabilityResponse) GetExtension() []*gnmi_ext.Extension { // the set of models from which data tree elements should be reported. // Reference: gNMI Specification Section 3.2.3 type ModelData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the model. + Organization string `protobuf:"bytes,2,opt,name=organization,proto3" json:"organization,omitempty"` // Organization publishing the model. + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` // Semantic version of the model. unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the model. - Organization string `protobuf:"bytes,2,opt,name=organization,proto3" json:"organization,omitempty"` // Organization publishing the model. - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` // Semantic version of the model. + sizeCache protoimpl.SizeCache } func (x *ModelData) Reset() { @@ -2361,7 +2376,7 @@ var ( var File_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto protoreflect.FileDescriptor -var file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc = []byte{ +var file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc = string([]byte{ 0x0a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x70, 0x72, 0x6f, @@ -2671,16 +2686,16 @@ var file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc = []byte{ 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescOnce sync.Once - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescData = file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc + file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescData []byte ) func file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescGZIP() []byte { file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescOnce.Do(func() { - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescData) + file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc))) }) return file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDescData } @@ -2830,7 +2845,7 @@ func file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc)), NumEnums: 5, NumMessages: 26, NumExtensions: 1, @@ -2843,7 +2858,6 @@ func file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_init() { ExtensionInfos: file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_extTypes, }.Build() File_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto = out.File - file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_rawDesc = nil file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_goTypes = nil file_github_com_openconfig_gnmi_proto_gnmi_gnmi_proto_depIdxs = nil } diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go index aaaa55d00..5536b80f4 100755 --- a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto @@ -32,6 +32,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -93,16 +94,15 @@ func (ExtensionID) EnumDescriptor() ([]byte, []int) { // The Extension message contains a single gNMI extension. type Extension struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Ext: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Ext: // // *Extension_RegisteredExt // *Extension_MasterArbitration // *Extension_History - Ext isExtension_Ext `protobuf_oneof:"ext"` + Ext isExtension_Ext `protobuf_oneof:"ext"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Extension) Reset() { @@ -135,30 +135,36 @@ func (*Extension) Descriptor() ([]byte, []int) { return file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescGZIP(), []int{0} } -func (m *Extension) GetExt() isExtension_Ext { - if m != nil { - return m.Ext +func (x *Extension) GetExt() isExtension_Ext { + if x != nil { + return x.Ext } return nil } func (x *Extension) GetRegisteredExt() *RegisteredExtension { - if x, ok := x.GetExt().(*Extension_RegisteredExt); ok { - return x.RegisteredExt + if x != nil { + if x, ok := x.Ext.(*Extension_RegisteredExt); ok { + return x.RegisteredExt + } } return nil } func (x *Extension) GetMasterArbitration() *MasterArbitration { - if x, ok := x.GetExt().(*Extension_MasterArbitration); ok { - return x.MasterArbitration + if x != nil { + if x, ok := x.Ext.(*Extension_MasterArbitration); ok { + return x.MasterArbitration + } } return nil } func (x *Extension) GetHistory() *History { - if x, ok := x.GetExt().(*Extension_History); ok { - return x.History + if x != nil { + if x, ok := x.Ext.(*Extension_History); ok { + return x.History + } } return nil } @@ -189,12 +195,11 @@ func (*Extension_History) isExtension_Ext() {} // The RegisteredExtension message defines an extension which is defined outside // of this file. type RegisteredExtension struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id ExtensionID `protobuf:"varint,1,opt,name=id,proto3,enum=gnmi_ext.ExtensionID" json:"id,omitempty"` // The unique ID assigned to this extension. + Msg []byte `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` // The binary-marshalled protobuf extension payload. unknownFields protoimpl.UnknownFields - - Id ExtensionID `protobuf:"varint,1,opt,name=id,proto3,enum=gnmi_ext.ExtensionID" json:"id,omitempty"` // The unique ID assigned to this extension. - Msg []byte `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` // The binary-marshalled protobuf extension payload. + sizeCache protoimpl.SizeCache } func (x *RegisteredExtension) Reset() { @@ -247,12 +252,11 @@ func (x *RegisteredExtension) GetMsg() []byte { // The document about gNMI master arbitration can be found at // https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-master-arbitration.md type MasterArbitration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + ElectionId *Uint128 `protobuf:"bytes,2,opt,name=election_id,json=electionId,proto3" json:"election_id,omitempty"` unknownFields protoimpl.UnknownFields - - Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` - ElectionId *Uint128 `protobuf:"bytes,2,opt,name=election_id,json=electionId,proto3" json:"election_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MasterArbitration) Reset() { @@ -301,12 +305,11 @@ func (x *MasterArbitration) GetElectionId() *Uint128 { // Representation of unsigned 128-bit integer. type Uint128 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + High uint64 `protobuf:"varint,1,opt,name=high,proto3" json:"high,omitempty"` + Low uint64 `protobuf:"varint,2,opt,name=low,proto3" json:"low,omitempty"` unknownFields protoimpl.UnknownFields - - High uint64 `protobuf:"varint,1,opt,name=high,proto3" json:"high,omitempty"` - Low uint64 `protobuf:"varint,2,opt,name=low,proto3" json:"low,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Uint128) Reset() { @@ -355,11 +358,10 @@ func (x *Uint128) GetLow() uint64 { // There can be one master for each role. The role is identified by its id. type Role struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Role) Reset() { @@ -403,15 +405,14 @@ func (x *Role) GetId() string { // spec can be found at // https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md type History struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Request: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Request: // // *History_SnapshotTime // *History_Range - Request isHistory_Request `protobuf_oneof:"request"` + Request isHistory_Request `protobuf_oneof:"request"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *History) Reset() { @@ -444,23 +445,27 @@ func (*History) Descriptor() ([]byte, []int) { return file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescGZIP(), []int{5} } -func (m *History) GetRequest() isHistory_Request { - if m != nil { - return m.Request +func (x *History) GetRequest() isHistory_Request { + if x != nil { + return x.Request } return nil } func (x *History) GetSnapshotTime() int64 { - if x, ok := x.GetRequest().(*History_SnapshotTime); ok { - return x.SnapshotTime + if x != nil { + if x, ok := x.Request.(*History_SnapshotTime); ok { + return x.SnapshotTime + } } return 0 } func (x *History) GetRange() *TimeRange { - if x, ok := x.GetRequest().(*History_Range); ok { - return x.Range + if x != nil { + if x, ok := x.Request.(*History_Range); ok { + return x.Range + } } return nil } @@ -482,12 +487,11 @@ func (*History_SnapshotTime) isHistory_Request() {} func (*History_Range) isHistory_Request() {} type TimeRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"` // Nanoseconds since the epoch + End int64 `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"` // Nanoseconds since the epoch unknownFields protoimpl.UnknownFields - - Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"` // Nanoseconds since the epoch - End int64 `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"` // Nanoseconds since the epoch + sizeCache protoimpl.SizeCache } func (x *TimeRange) Reset() { @@ -536,7 +540,7 @@ func (x *TimeRange) GetEnd() int64 { var File_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto protoreflect.FileDescriptor -var file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc = []byte{ +var file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc = string([]byte{ 0x0a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x65, 0x78, 0x74, 0x2f, 0x67, 0x6e, 0x6d, 0x69, @@ -588,16 +592,16 @@ var file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc = []by 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x65, 0x78, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescOnce sync.Once - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescData = file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc + file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescData []byte ) func file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescGZIP() []byte { file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescOnce.Do(func() { - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescData) + file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc))) }) return file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDescData } @@ -647,7 +651,7 @@ func file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc)), NumEnums: 1, NumMessages: 7, NumExtensions: 0, @@ -659,7 +663,6 @@ func file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_init() { MessageInfos: file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_msgTypes, }.Build() File_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto = out.File - file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_rawDesc = nil file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_goTypes = nil file_github_com_openconfig_gnmi_proto_gnmi_ext_gnmi_ext_proto_depIdxs = nil } diff --git a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go index 168a726d8..607f004a9 100755 --- a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/target/target.proto @@ -31,6 +31,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -43,21 +44,18 @@ const ( // Configuration holds all information necessary for a caching gNMI collector // to establish subscriptions to a list of gNMI targets. type Configuration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Request is a keyed list of all SubscriptionRequests that can be sent to // to targets in the Configuration. // The request must have at minimum a SubscriptionList with a prefix // containing origin and one or more Subscriptions. Only the STREAM mode is // supported. - Request map[string]*gnmi.SubscribeRequest `protobuf:"bytes,1,rep,name=request,proto3" json:"request,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Request map[string]*gnmi.SubscribeRequest `protobuf:"bytes,1,rep,name=request,proto3" json:"request,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Target is the full list of targets connected to by a caching gNMI // collector. The key of the map is a unique name to identify a target and // is set in the prefix.target of a SubscriptionRequest message when connecting // to each respective target. - Target map[string]*Target `protobuf:"bytes,2,rep,name=target,proto3" json:"target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Target map[string]*Target `protobuf:"bytes,2,rep,name=target,proto3" json:"target,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Identifier for the caching collector. InstanceId string `protobuf:"bytes,3,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"` // Revision for this Configuration. Systems that non-atomically write @@ -65,7 +63,9 @@ type Configuration struct { // protobuf serialization of fields in order. Presence of this field makes no // guarantee. Consumers should account for atomicity constraints of their // environment and any custom encoding. - Revision int64 `protobuf:"varint,536870911,opt,name=revision,proto3" json:"revision,omitempty"` + Revision int64 `protobuf:"varint,536870911,opt,name=revision,proto3" json:"revision,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Configuration) Reset() { @@ -129,10 +129,7 @@ func (x *Configuration) GetRevision() int64 { // Target is the information necessary to establish a single gNMI Subscribe RPC // to be collected and cached. type Target struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A list of address and port or name that resolves to an address and port. Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` // Credentials to use in metadata for authorization of the RPC @@ -141,7 +138,9 @@ type Target struct { // the request map of the Configuration message. Request string `protobuf:"bytes,3,opt,name=request,proto3" json:"request,omitempty"` // Additional target metadata. - Meta map[string]string `protobuf:"bytes,4,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Meta map[string]string `protobuf:"bytes,4,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Target) Reset() { @@ -205,14 +204,13 @@ func (x *Target) GetMeta() map[string]string { // Credentials contains the fields necessary for authentication of the client to // the target. type Credentials struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` // Password lookup ID. - PasswordId string `protobuf:"bytes,3,opt,name=password_id,json=passwordId,proto3" json:"password_id,omitempty"` + PasswordId string `protobuf:"bytes,3,opt,name=password_id,json=passwordId,proto3" json:"password_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Credentials) Reset() { @@ -268,7 +266,7 @@ func (x *Credentials) GetPasswordId() string { var File_github_com_openconfig_gnmi_proto_target_target_proto protoreflect.FileDescriptor -var file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc = []byte{ +var file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc = string([]byte{ 0x0a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, @@ -323,16 +321,16 @@ var file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc = []byte{ 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescOnce sync.Once - file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescData = file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc + file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescData []byte ) func file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescGZIP() []byte { file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescOnce.Do(func() { - file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescData) + file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc))) }) return file_github_com_openconfig_gnmi_proto_target_target_proto_rawDescData } @@ -370,7 +368,7 @@ func file_github_com_openconfig_gnmi_proto_target_target_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc), len(file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc)), NumEnums: 0, NumMessages: 6, NumExtensions: 0, @@ -381,7 +379,6 @@ func file_github_com_openconfig_gnmi_proto_target_target_proto_init() { MessageInfos: file_github_com_openconfig_gnmi_proto_target_target_proto_msgTypes, }.Build() File_github_com_openconfig_gnmi_proto_target_target_proto = out.File - file_github_com_openconfig_gnmi_proto_target_target_proto_rawDesc = nil file_github_com_openconfig_gnmi_proto_target_target_proto_goTypes = nil file_github_com_openconfig_gnmi_proto_target_target_proto_depIdxs = nil } diff --git a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go index 1beb87208..18fcb6386 100755 --- a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go +++ b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: github.com/openconfig/gnmi/testing/fake/proto/fake.proto @@ -17,6 +17,7 @@ import ( anypb "google.golang.org/protobuf/types/known/anypb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -130,12 +131,11 @@ func (Config_ClientType) EnumDescriptor() ([]byte, []int) { // Configuration is used to store all agent configuration for the fake agent // server. Each config describes a single agent hosted on the server. type Configuration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Repeated list of targets to emulate. - Config []*Config `protobuf:"bytes,1,rep,name=config,proto3" json:"config,omitempty"` + Config []*Config `protobuf:"bytes,1,rep,name=config,proto3" json:"config,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Configuration) Reset() { @@ -176,12 +176,11 @@ func (x *Configuration) GetConfig() []*Config { } type Credentials struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Credentials) Reset() { @@ -231,10 +230,7 @@ func (x *Credentials) GetPassword() string { // Config is a collection of values that together represent the update streams // for one or more fake devices. type Config struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The target for which the fake will publish values for. Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` // Port for the agent to listen on. If 0 or unset the agent will pick a port @@ -269,7 +265,7 @@ type Config struct { EnableDelay bool `protobuf:"varint,10,opt,name=enable_delay,json=enableDelay,proto3" json:"enable_delay,omitempty"` // Generator for value series for the target. // - // Types that are assignable to Generator: + // Types that are valid to be assigned to Generator: // // *Config_Custom // *Config_Random @@ -278,7 +274,9 @@ type Config struct { // tunnel_addr is the address of the tunnel server. TunnelAddr string `protobuf:"bytes,11,opt,name=tunnel_addr,json=tunnelAddr,proto3" json:"tunnel_addr,omitempty"` // tunnel_crt is the certificate file for the tunnel conection. - TunnelCrt string `protobuf:"bytes,12,opt,name=tunnel_crt,json=tunnelCrt,proto3" json:"tunnel_crt,omitempty"` + TunnelCrt string `protobuf:"bytes,12,opt,name=tunnel_crt,json=tunnelCrt,proto3" json:"tunnel_crt,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Config) Reset() { @@ -383,30 +381,36 @@ func (x *Config) GetEnableDelay() bool { return false } -func (m *Config) GetGenerator() isConfig_Generator { - if m != nil { - return m.Generator +func (x *Config) GetGenerator() isConfig_Generator { + if x != nil { + return x.Generator } return nil } func (x *Config) GetCustom() *anypb.Any { - if x, ok := x.GetGenerator().(*Config_Custom); ok { - return x.Custom + if x != nil { + if x, ok := x.Generator.(*Config_Custom); ok { + return x.Custom + } } return nil } func (x *Config) GetRandom() *RandomGenerator { - if x, ok := x.GetGenerator().(*Config_Random); ok { - return x.Random + if x != nil { + if x, ok := x.Generator.(*Config_Random); ok { + return x.Random + } } return nil } func (x *Config) GetFixed() *FixedGenerator { - if x, ok := x.GetGenerator().(*Config_Fixed); ok { - return x.Fixed + if x != nil { + if x, ok := x.Generator.(*Config_Fixed); ok { + return x.Fixed + } } return nil } @@ -448,11 +452,10 @@ func (*Config_Random) isConfig_Generator() {} func (*Config_Fixed) isConfig_Generator() {} type FixedGenerator struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Responses []*gnmi.SubscribeResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"` unknownFields protoimpl.UnknownFields - - Responses []*gnmi.SubscribeResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"` + sizeCache protoimpl.SizeCache } func (x *FixedGenerator) Reset() { @@ -493,12 +496,11 @@ func (x *FixedGenerator) GetResponses() []*gnmi.SubscribeResponse { } type RandomGenerator struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Seed int64 `protobuf:"varint,1,opt,name=seed,proto3" json:"seed,omitempty"` + Values []*Value `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"` unknownFields protoimpl.UnknownFields - - Seed int64 `protobuf:"varint,1,opt,name=seed,proto3" json:"seed,omitempty"` - Values []*Value `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RandomGenerator) Reset() { @@ -547,9 +549,9 @@ func (x *RandomGenerator) GetValues() []*Value { // Delete will cause the value to be deleted at the Value's path. type DeleteValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeleteValue) Reset() { @@ -586,10 +588,7 @@ func (*DeleteValue) Descriptor() ([]byte, []int) { // path. A file containing a list of values can be used to simulate a network // device for integration tests. type Value struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The device specific, or OpenConfig path corresponding to a value. Path []string `protobuf:"bytes,1,rep,name=path,proto3" json:"path,omitempty"` // The initial timestamp and configuration on how the timestamp will change @@ -605,7 +604,7 @@ type Value struct { // The initial value of the chosen type including configuration on how the // value will mutate for subsequent updates. // - // Types that are assignable to Value: + // Types that are valid to be assigned to Value: // // *Value_IntValue // *Value_DoubleValue @@ -615,7 +614,9 @@ type Value struct { // *Value_BoolValue // *Value_UintValue // *Value_StringListValue - Value isValue_Value `protobuf_oneof:"value"` + Value isValue_Value `protobuf_oneof:"value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Value) Reset() { @@ -676,65 +677,81 @@ func (x *Value) GetSeed() int64 { return 0 } -func (m *Value) GetValue() isValue_Value { - if m != nil { - return m.Value +func (x *Value) GetValue() isValue_Value { + if x != nil { + return x.Value } return nil } func (x *Value) GetIntValue() *IntValue { - if x, ok := x.GetValue().(*Value_IntValue); ok { - return x.IntValue + if x != nil { + if x, ok := x.Value.(*Value_IntValue); ok { + return x.IntValue + } } return nil } func (x *Value) GetDoubleValue() *DoubleValue { - if x, ok := x.GetValue().(*Value_DoubleValue); ok { - return x.DoubleValue + if x != nil { + if x, ok := x.Value.(*Value_DoubleValue); ok { + return x.DoubleValue + } } return nil } func (x *Value) GetStringValue() *StringValue { - if x, ok := x.GetValue().(*Value_StringValue); ok { - return x.StringValue + if x != nil { + if x, ok := x.Value.(*Value_StringValue); ok { + return x.StringValue + } } return nil } func (x *Value) GetSync() uint64 { - if x, ok := x.GetValue().(*Value_Sync); ok { - return x.Sync + if x != nil { + if x, ok := x.Value.(*Value_Sync); ok { + return x.Sync + } } return 0 } func (x *Value) GetDelete() *DeleteValue { - if x, ok := x.GetValue().(*Value_Delete); ok { - return x.Delete + if x != nil { + if x, ok := x.Value.(*Value_Delete); ok { + return x.Delete + } } return nil } func (x *Value) GetBoolValue() *BoolValue { - if x, ok := x.GetValue().(*Value_BoolValue); ok { - return x.BoolValue + if x != nil { + if x, ok := x.Value.(*Value_BoolValue); ok { + return x.BoolValue + } } return nil } func (x *Value) GetUintValue() *UintValue { - if x, ok := x.GetValue().(*Value_UintValue); ok { - return x.UintValue + if x != nil { + if x, ok := x.Value.(*Value_UintValue); ok { + return x.UintValue + } } return nil } func (x *Value) GetStringListValue() *StringListValue { - if x, ok := x.GetValue().(*Value_StringListValue); ok { - return x.StringListValue + if x != nil { + if x, ok := x.Value.(*Value_StringListValue); ok { + return x.StringListValue + } } return nil } @@ -792,10 +809,7 @@ func (*Value_UintValue) isValue_Value() {} func (*Value_StringListValue) isValue_Value() {} type Timestamp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Initial timestamp for the corresponding value, nanoseconds since epoch. // This value need have no relation to absolute real-time as the stream of // of updates is generated without regard to the real clock and can be run @@ -804,8 +818,10 @@ type Timestamp struct { // These values will vary the change in the timestamp for subsequent outputs // by a value between delta_min and delta_max. Set to the same value to force // a set periodic interval. - DeltaMin int64 `protobuf:"varint,2,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` - DeltaMax int64 `protobuf:"varint,3,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + DeltaMin int64 `protobuf:"varint,2,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` + DeltaMax int64 `protobuf:"varint,3,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Timestamp) Reset() { @@ -860,10 +876,7 @@ func (x *Timestamp) GetDeltaMax() int64 { } type IntValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // If distribution is IntRange, value is used as the initial value // inside [minimum, maximum] and hold the value as it mutates. // If distribution is IntList, value is only used to hold the value as it @@ -871,11 +884,13 @@ type IntValue struct { // If no distribution is set, value is used as it mutates, i.e. constant // update. Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - // Types that are assignable to Distribution: + // Types that are valid to be assigned to Distribution: // // *IntValue_Range // *IntValue_List - Distribution isIntValue_Distribution `protobuf_oneof:"distribution"` + Distribution isIntValue_Distribution `protobuf_oneof:"distribution"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IntValue) Reset() { @@ -915,23 +930,27 @@ func (x *IntValue) GetValue() int64 { return 0 } -func (m *IntValue) GetDistribution() isIntValue_Distribution { - if m != nil { - return m.Distribution +func (x *IntValue) GetDistribution() isIntValue_Distribution { + if x != nil { + return x.Distribution } return nil } func (x *IntValue) GetRange() *IntRange { - if x, ok := x.GetDistribution().(*IntValue_Range); ok { - return x.Range + if x != nil { + if x, ok := x.Distribution.(*IntValue_Range); ok { + return x.Range + } } return nil } func (x *IntValue) GetList() *IntList { - if x, ok := x.GetDistribution().(*IntValue_List); ok { - return x.List + if x != nil { + if x, ok := x.Distribution.(*IntValue_List); ok { + return x.List + } } return nil } @@ -953,10 +972,7 @@ func (*IntValue_Range) isIntValue_Distribution() {} func (*IntValue_List) isIntValue_Distribution() {} type IntRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The range of the value allowed. Minimum int64 `protobuf:"varint,1,opt,name=minimum,proto3" json:"minimum,omitempty"` Maximum int64 `protobuf:"varint,2,opt,name=maximum,proto3" json:"maximum,omitempty"` @@ -965,8 +981,10 @@ type IntRange struct { // minimum and maximum are still respected and values will saturate at the // boundaries if they are exceeded. If not set subsequent value is a value // randomly chosen between minimum and maximum. - DeltaMin int64 `protobuf:"varint,3,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` - DeltaMax int64 `protobuf:"varint,4,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + DeltaMin int64 `protobuf:"varint,3,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` + DeltaMax int64 `protobuf:"varint,4,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IntRange) Reset() { @@ -1028,15 +1046,14 @@ func (x *IntRange) GetDeltaMax() int64 { } type IntList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The set of values which can be used. Options []int64 `protobuf:"varint,1,rep,packed,name=options,proto3" json:"options,omitempty"` // Set to true to randomize selection of value from options. If false, the // values are cycled in order, starting at index 0. - Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IntList) Reset() { @@ -1084,10 +1101,7 @@ func (x *IntList) GetRandom() bool { } type DoubleValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // If distribution is DoubleRange, value is used as the initial value // inside [minimum, maximum] and hold the value as it mutates. // If distribution is DoubleList, value is only used to hold the value as it @@ -1095,11 +1109,13 @@ type DoubleValue struct { // If no distribution is set, value is used as it mutates, i.e. constant // update. Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` - // Types that are assignable to Distribution: + // Types that are valid to be assigned to Distribution: // // *DoubleValue_Range // *DoubleValue_List - Distribution isDoubleValue_Distribution `protobuf_oneof:"distribution"` + Distribution isDoubleValue_Distribution `protobuf_oneof:"distribution"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DoubleValue) Reset() { @@ -1139,23 +1155,27 @@ func (x *DoubleValue) GetValue() float64 { return 0 } -func (m *DoubleValue) GetDistribution() isDoubleValue_Distribution { - if m != nil { - return m.Distribution +func (x *DoubleValue) GetDistribution() isDoubleValue_Distribution { + if x != nil { + return x.Distribution } return nil } func (x *DoubleValue) GetRange() *DoubleRange { - if x, ok := x.GetDistribution().(*DoubleValue_Range); ok { - return x.Range + if x != nil { + if x, ok := x.Distribution.(*DoubleValue_Range); ok { + return x.Range + } } return nil } func (x *DoubleValue) GetList() *DoubleList { - if x, ok := x.GetDistribution().(*DoubleValue_List); ok { - return x.List + if x != nil { + if x, ok := x.Distribution.(*DoubleValue_List); ok { + return x.List + } } return nil } @@ -1177,10 +1197,7 @@ func (*DoubleValue_Range) isDoubleValue_Distribution() {} func (*DoubleValue_List) isDoubleValue_Distribution() {} type DoubleRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The range of the value allowed. Minimum float64 `protobuf:"fixed64,1,opt,name=minimum,proto3" json:"minimum,omitempty"` Maximum float64 `protobuf:"fixed64,2,opt,name=maximum,proto3" json:"maximum,omitempty"` @@ -1188,8 +1205,10 @@ type DoubleRange struct { // where delta is randomly chosen between delta_min and delta_max. The range // minimum and maximum are still respected. If not set subsequent value is a // value randomly chosen between minimum and maximum. - DeltaMin float64 `protobuf:"fixed64,3,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` - DeltaMax float64 `protobuf:"fixed64,4,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + DeltaMin float64 `protobuf:"fixed64,3,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` + DeltaMax float64 `protobuf:"fixed64,4,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DoubleRange) Reset() { @@ -1251,15 +1270,14 @@ func (x *DoubleRange) GetDeltaMax() float64 { } type DoubleList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The set of values which can be used. Options []float64 `protobuf:"fixed64,1,rep,packed,name=options,proto3" json:"options,omitempty"` // Set to true to randomize selection of value from options. If false, the // values are cycled in order. - Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DoubleList) Reset() { @@ -1307,19 +1325,18 @@ func (x *DoubleList) GetRandom() bool { } type StringValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // If distribution is StringList, value is used to hold the value as it // mutates. // If no distribution is set, value is used as it mutates, i.e. constant // update. Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - // Types that are assignable to Distribution: + // Types that are valid to be assigned to Distribution: // // *StringValue_List - Distribution isStringValue_Distribution `protobuf_oneof:"distribution"` + Distribution isStringValue_Distribution `protobuf_oneof:"distribution"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StringValue) Reset() { @@ -1359,16 +1376,18 @@ func (x *StringValue) GetValue() string { return "" } -func (m *StringValue) GetDistribution() isStringValue_Distribution { - if m != nil { - return m.Distribution +func (x *StringValue) GetDistribution() isStringValue_Distribution { + if x != nil { + return x.Distribution } return nil } func (x *StringValue) GetList() *StringList { - if x, ok := x.GetDistribution().(*StringValue_List); ok { - return x.List + if x != nil { + if x, ok := x.Distribution.(*StringValue_List); ok { + return x.List + } } return nil } @@ -1384,15 +1403,14 @@ type StringValue_List struct { func (*StringValue_List) isStringValue_Distribution() {} type StringList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The set of strings which can be used. Options []string `protobuf:"bytes,1,rep,name=options,proto3" json:"options,omitempty"` // Set to true to randomize selection of value from options. If false, the // values are cycled in order, starting at index 0. - Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StringList) Reset() { @@ -1440,19 +1458,18 @@ func (x *StringList) GetRandom() bool { } type StringListValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // If distribution is StringList, value is used to hold the value as it // mutates. // If no distribution is set, value is used as it mutates, i.e. constant // update. Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` - // Types that are assignable to Distribution: + // Types that are valid to be assigned to Distribution: // // *StringListValue_List - Distribution isStringListValue_Distribution `protobuf_oneof:"distribution"` + Distribution isStringListValue_Distribution `protobuf_oneof:"distribution"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StringListValue) Reset() { @@ -1492,16 +1509,18 @@ func (x *StringListValue) GetValue() []string { return nil } -func (m *StringListValue) GetDistribution() isStringListValue_Distribution { - if m != nil { - return m.Distribution +func (x *StringListValue) GetDistribution() isStringListValue_Distribution { + if x != nil { + return x.Distribution } return nil } func (x *StringListValue) GetList() *StringList { - if x, ok := x.GetDistribution().(*StringListValue_List); ok { - return x.List + if x != nil { + if x, ok := x.Distribution.(*StringListValue_List); ok { + return x.List + } } return nil } @@ -1517,19 +1536,18 @@ type StringListValue_List struct { func (*StringListValue_List) isStringListValue_Distribution() {} type BoolValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // If distribution is BoolList, value is only used to hold the value as it // mutates. // If no distribution is set, value is used as it mutates, i.e. constant // update. Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - // Types that are assignable to Distribution: + // Types that are valid to be assigned to Distribution: // // *BoolValue_List - Distribution isBoolValue_Distribution `protobuf_oneof:"distribution"` + Distribution isBoolValue_Distribution `protobuf_oneof:"distribution"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BoolValue) Reset() { @@ -1569,16 +1587,18 @@ func (x *BoolValue) GetValue() bool { return false } -func (m *BoolValue) GetDistribution() isBoolValue_Distribution { - if m != nil { - return m.Distribution +func (x *BoolValue) GetDistribution() isBoolValue_Distribution { + if x != nil { + return x.Distribution } return nil } func (x *BoolValue) GetList() *BoolList { - if x, ok := x.GetDistribution().(*BoolValue_List); ok { - return x.List + if x != nil { + if x, ok := x.Distribution.(*BoolValue_List); ok { + return x.List + } } return nil } @@ -1594,15 +1614,14 @@ type BoolValue_List struct { func (*BoolValue_List) isBoolValue_Distribution() {} type BoolList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The set of values which can be used. Options []bool `protobuf:"varint,1,rep,packed,name=options,proto3" json:"options,omitempty"` // Set to true to randomize selection of value from options. If false, the // values are cycled in order, starting at index 0. - Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *BoolList) Reset() { @@ -1650,10 +1669,7 @@ func (x *BoolList) GetRandom() bool { } type UintValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // If distribution is UintRange, value is used as the initial value // inside [minimum, maximum] and hold the value as it mutates. // If distribution is UintList, value is only used to hold the value as it @@ -1661,11 +1677,13 @@ type UintValue struct { // If no distribution is set, value is used as it mutates, i.e. constant // update. Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` - // Types that are assignable to Distribution: + // Types that are valid to be assigned to Distribution: // // *UintValue_Range // *UintValue_List - Distribution isUintValue_Distribution `protobuf_oneof:"distribution"` + Distribution isUintValue_Distribution `protobuf_oneof:"distribution"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UintValue) Reset() { @@ -1705,23 +1723,27 @@ func (x *UintValue) GetValue() uint64 { return 0 } -func (m *UintValue) GetDistribution() isUintValue_Distribution { - if m != nil { - return m.Distribution +func (x *UintValue) GetDistribution() isUintValue_Distribution { + if x != nil { + return x.Distribution } return nil } func (x *UintValue) GetRange() *UintRange { - if x, ok := x.GetDistribution().(*UintValue_Range); ok { - return x.Range + if x != nil { + if x, ok := x.Distribution.(*UintValue_Range); ok { + return x.Range + } } return nil } func (x *UintValue) GetList() *UintList { - if x, ok := x.GetDistribution().(*UintValue_List); ok { - return x.List + if x != nil { + if x, ok := x.Distribution.(*UintValue_List); ok { + return x.List + } } return nil } @@ -1743,10 +1765,7 @@ func (*UintValue_Range) isUintValue_Distribution() {} func (*UintValue_List) isUintValue_Distribution() {} type UintRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The range of the value allowed. Minimum uint64 `protobuf:"varint,1,opt,name=minimum,proto3" json:"minimum,omitempty"` Maximum uint64 `protobuf:"varint,2,opt,name=maximum,proto3" json:"maximum,omitempty"` @@ -1755,8 +1774,10 @@ type UintRange struct { // minimum and maximum are still respected and values will saturate at the // boundaries if they are exceeded. If not set subsequent value is a value // randomly chosen between minimum and maximum. - DeltaMin int64 `protobuf:"varint,3,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` - DeltaMax int64 `protobuf:"varint,4,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + DeltaMin int64 `protobuf:"varint,3,opt,name=delta_min,json=deltaMin,proto3" json:"delta_min,omitempty"` + DeltaMax int64 `protobuf:"varint,4,opt,name=delta_max,json=deltaMax,proto3" json:"delta_max,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UintRange) Reset() { @@ -1818,15 +1839,14 @@ func (x *UintRange) GetDeltaMax() int64 { } type UintList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The set of values which can be used. Options []uint64 `protobuf:"varint,1,rep,packed,name=options,proto3" json:"options,omitempty"` // Set to true to randomize selection of value from options. If false, the // values are cycled in order, starting at index 0. - Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + Random bool `protobuf:"varint,2,opt,name=random,proto3" json:"random,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UintList) Reset() { @@ -1875,7 +1895,7 @@ func (x *UintList) GetRandom() bool { var File_github_com_openconfig_gnmi_testing_fake_proto_fake_proto protoreflect.FileDescriptor -var file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc = []byte{ +var file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc = string([]byte{ 0x0a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x66, 0x61, 0x6b, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, @@ -2092,16 +2112,16 @@ var file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc = []by 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x66, 0x61, 0x6b, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x66, 0x61, 0x6b, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescOnce sync.Once - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescData = file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc + file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescData []byte ) func file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescGZIP() []byte { file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescOnce.Do(func() { - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescData) + file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc), len(file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc))) }) return file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDescData } @@ -2221,7 +2241,7 @@ func file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc), len(file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc)), NumEnums: 2, NumMessages: 22, NumExtensions: 0, @@ -2233,7 +2253,6 @@ func file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_init() { MessageInfos: file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_msgTypes, }.Build() File_github_com_openconfig_gnmi_testing_fake_proto_fake_proto = out.File - file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_rawDesc = nil file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_goTypes = nil file_github_com_openconfig_gnmi_testing_fake_proto_fake_proto_depIdxs = nil } diff --git a/api/go/gosdn/app/app.pb.go b/api/go/gosdn/app/app.pb.go index 8064592bd..2f69f65da 100755 --- a/api/go/gosdn/app/app.pb.go +++ b/api/go/gosdn/app/app.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/app/app.proto @@ -15,6 +15,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -25,13 +26,12 @@ const ( ) type AppRegisterRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Appname string `protobuf:"bytes,2,opt,name=appname,proto3" json:"appname,omitempty"` + Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Appname string `protobuf:"bytes,2,opt,name=appname,proto3" json:"appname,omitempty"` - Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AppRegisterRequest) Reset() { @@ -86,12 +86,11 @@ func (x *AppRegisterRequest) GetToken() string { } type AppRegisterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Queueconnection string `protobuf:"bytes,2,opt,name=queueconnection,proto3" json:"queueconnection,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Queueconnection string `protobuf:"bytes,2,opt,name=queueconnection,proto3" json:"queueconnection,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AppRegisterResponse) Reset() { @@ -139,12 +138,11 @@ func (x *AppRegisterResponse) GetQueueconnection() string { } type AppDeregisterRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Appname string `protobuf:"bytes,2,opt,name=appname,proto3" json:"appname,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Appname string `protobuf:"bytes,2,opt,name=appname,proto3" json:"appname,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AppDeregisterRequest) Reset() { @@ -192,11 +190,10 @@ func (x *AppDeregisterRequest) GetAppname() string { } type AppDeregisterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AppDeregisterResponse) Reset() { @@ -238,7 +235,7 @@ func (x *AppDeregisterResponse) GetTimestamp() int64 { var File_gosdn_app_app_proto protoreflect.FileDescriptor -var file_gosdn_app_app_proto_rawDesc = []byte{ +var file_gosdn_app_app_proto_rawDesc = string([]byte{ 0x0a, 0x13, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x61, 0x70, 0x70, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, @@ -290,16 +287,16 @@ var file_gosdn_app_app_proto_rawDesc = []byte{ 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_app_app_proto_rawDescOnce sync.Once - file_gosdn_app_app_proto_rawDescData = file_gosdn_app_app_proto_rawDesc + file_gosdn_app_app_proto_rawDescData []byte ) func file_gosdn_app_app_proto_rawDescGZIP() []byte { file_gosdn_app_app_proto_rawDescOnce.Do(func() { - file_gosdn_app_app_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_app_app_proto_rawDescData) + file_gosdn_app_app_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_app_app_proto_rawDesc), len(file_gosdn_app_app_proto_rawDesc))) }) return file_gosdn_app_app_proto_rawDescData } @@ -332,7 +329,7 @@ func file_gosdn_app_app_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_app_app_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_app_app_proto_rawDesc), len(file_gosdn_app_app_proto_rawDesc)), NumEnums: 0, NumMessages: 4, NumExtensions: 0, @@ -343,7 +340,6 @@ func file_gosdn_app_app_proto_init() { MessageInfos: file_gosdn_app_app_proto_msgTypes, }.Build() File_gosdn_app_app_proto = out.File - file_gosdn_app_app_proto_rawDesc = nil file_gosdn_app_app_proto_goTypes = nil file_gosdn_app_app_proto_depIdxs = nil } diff --git a/api/go/gosdn/app/app.pb.gw.go b/api/go/gosdn/app/app.pb.gw.go index 8ff05688f..852173e5a 100755 --- a/api/go/gosdn/app/app.pb.gw.go +++ b/api/go/gosdn/app/app.pb.gw.go @@ -10,6 +10,7 @@ package app import ( "context" + "errors" "io" "net/http" @@ -24,63 +25,62 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_AppService_Register_0(ctx context.Context, marshaler runtime.Marshaler, client AppServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AppRegisterRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AppRegisterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Register(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_AppService_Register_0(ctx context.Context, marshaler runtime.Marshaler, server AppServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AppRegisterRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AppRegisterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Register(ctx, &protoReq) return msg, metadata, err - } func request_AppService_Deregister_0(ctx context.Context, marshaler runtime.Marshaler, client AppServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AppDeregisterRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AppDeregisterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Deregister(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_AppService_Deregister_0(ctx context.Context, marshaler runtime.Marshaler, server AppServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AppDeregisterRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AppDeregisterRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Deregister(ctx, &protoReq) return msg, metadata, err - } // RegisterAppServiceHandlerServer registers the http handlers for service AppService to "mux". @@ -89,16 +89,13 @@ func local_request_AppService_Deregister_0(ctx context.Context, marshaler runtim // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAppServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterAppServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AppServiceServer) error { - - mux.Handle("POST", pattern_AppService_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AppService_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.app.AppService/Register", runtime.WithHTTPPathPattern("/register")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.app.AppService/Register", runtime.WithHTTPPathPattern("/register")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -110,20 +107,15 @@ func RegisterAppServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AppService_Register_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_AppService_Deregister_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AppService_Deregister_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.app.AppService/Deregister", runtime.WithHTTPPathPattern("/deregister")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.app.AppService/Deregister", runtime.WithHTTPPathPattern("/deregister")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -135,9 +127,7 @@ func RegisterAppServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AppService_Deregister_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -164,7 +154,6 @@ func RegisterAppServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Ser } }() }() - return RegisterAppServiceHandler(ctx, mux, conn) } @@ -180,14 +169,11 @@ func RegisterAppServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "AppServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterAppServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AppServiceClient) error { - - mux.Handle("POST", pattern_AppService_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AppService_Register_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.app.AppService/Register", runtime.WithHTTPPathPattern("/register")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.app.AppService/Register", runtime.WithHTTPPathPattern("/register")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -198,18 +184,13 @@ func RegisterAppServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AppService_Register_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_AppService_Deregister_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AppService_Deregister_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.app.AppService/Deregister", runtime.WithHTTPPathPattern("/deregister")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.app.AppService/Deregister", runtime.WithHTTPPathPattern("/deregister")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -220,22 +201,17 @@ func RegisterAppServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AppService_Deregister_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_AppService_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "")) - + pattern_AppService_Register_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"register"}, "")) pattern_AppService_Deregister_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"deregister"}, "")) ) var ( - forward_AppService_Register_0 = runtime.ForwardResponseMessage - + forward_AppService_Register_0 = runtime.ForwardResponseMessage forward_AppService_Deregister_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go index b4600ce3f..1a8b68cab 100755 --- a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go +++ b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/configurationmanagement/configurationmanagement.proto @@ -14,6 +14,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -24,12 +25,11 @@ const ( ) type ExportSDNConfigRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ExportSDNConfigRequest) Reset() { @@ -77,12 +77,11 @@ func (x *ExportSDNConfigRequest) GetPid() string { } type ExportSDNConfigResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + SdnConfigData string `protobuf:"bytes,2,opt,name=sdnConfigData,proto3" json:"sdnConfigData,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - SdnConfigData string `protobuf:"bytes,2,opt,name=sdnConfigData,proto3" json:"sdnConfigData,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ExportSDNConfigResponse) Reset() { @@ -130,13 +129,12 @@ func (x *ExportSDNConfigResponse) GetSdnConfigData() string { } type ImportSDNConfigRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + SdnConfigData string `protobuf:"bytes,3,opt,name=sdnConfigData,proto3" json:"sdnConfigData,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` - SdnConfigData string `protobuf:"bytes,3,opt,name=sdnConfigData,proto3" json:"sdnConfigData,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ImportSDNConfigRequest) Reset() { @@ -191,11 +189,10 @@ func (x *ImportSDNConfigRequest) GetSdnConfigData() string { } type ImportSDNConfigResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *ImportSDNConfigResponse) Reset() { @@ -237,7 +234,7 @@ func (x *ImportSDNConfigResponse) GetTimestamp() int64 { var File_gosdn_configurationmanagement_configurationmanagement_proto protoreflect.FileDescriptor -var file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc = []byte{ +var file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc = string([]byte{ 0x0a, 0x3b, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x6e, @@ -297,16 +294,16 @@ var file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc = [ 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescOnce sync.Once - file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescData = file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc + file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescData []byte ) func file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescGZIP() []byte { file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescOnce.Do(func() { - file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescData) + file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc), len(file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc))) }) return file_gosdn_configurationmanagement_configurationmanagement_proto_rawDescData } @@ -339,7 +336,7 @@ func file_gosdn_configurationmanagement_configurationmanagement_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc), len(file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc)), NumEnums: 0, NumMessages: 4, NumExtensions: 0, @@ -350,7 +347,6 @@ func file_gosdn_configurationmanagement_configurationmanagement_proto_init() { MessageInfos: file_gosdn_configurationmanagement_configurationmanagement_proto_msgTypes, }.Build() File_gosdn_configurationmanagement_configurationmanagement_proto = out.File - file_gosdn_configurationmanagement_configurationmanagement_proto_rawDesc = nil file_gosdn_configurationmanagement_configurationmanagement_proto_goTypes = nil file_gosdn_configurationmanagement_configurationmanagement_proto_depIdxs = nil } diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go index a0a3160e0..20532a162 100755 --- a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go +++ b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go @@ -10,6 +10,7 @@ package core import ( "context" + "errors" "io" "net/http" @@ -24,151 +25,114 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join - var ( - filter_ConfigurationManagementService_ExportSDNConfig_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join ) -func request_ConfigurationManagementService_ExportSDNConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigurationManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ExportSDNConfigRequest - var metadata runtime.ServerMetadata +var filter_ConfigurationManagementService_ExportSDNConfig_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +func request_ConfigurationManagementService_ExportSDNConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigurationManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - val string - ok bool - err error - _ = err + protoReq ExportSDNConfigRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigurationManagementService_ExportSDNConfig_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ExportSDNConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ConfigurationManagementService_ExportSDNConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigurationManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ExportSDNConfigRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ExportSDNConfigRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigurationManagementService_ExportSDNConfig_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ExportSDNConfig(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_ConfigurationManagementService_ImportSDNConfig_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_ConfigurationManagementService_ImportSDNConfig_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_ConfigurationManagementService_ImportSDNConfig_0(ctx context.Context, marshaler runtime.Marshaler, client ConfigurationManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ImportSDNConfigRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ImportSDNConfigRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigurationManagementService_ImportSDNConfig_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ImportSDNConfig(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_ConfigurationManagementService_ImportSDNConfig_0(ctx context.Context, marshaler runtime.Marshaler, server ConfigurationManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ImportSDNConfigRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq ImportSDNConfigRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ConfigurationManagementService_ImportSDNConfig_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ImportSDNConfig(ctx, &protoReq) return msg, metadata, err - } // RegisterConfigurationManagementServiceHandlerServer registers the http handlers for service ConfigurationManagementService to "mux". @@ -177,16 +141,13 @@ func local_request_ConfigurationManagementService_ImportSDNConfig_0(ctx context. // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterConfigurationManagementServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterConfigurationManagementServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ConfigurationManagementServiceServer) error { - - mux.Handle("GET", pattern_ConfigurationManagementService_ExportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ConfigurationManagementService_ExportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ExportSDNConfig", runtime.WithHTTPPathPattern("/export/{pid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ExportSDNConfig", runtime.WithHTTPPathPattern("/export/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -198,20 +159,15 @@ func RegisterConfigurationManagementServiceHandlerServer(ctx context.Context, mu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ConfigurationManagementService_ExportSDNConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ConfigurationManagementService_ImportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ConfigurationManagementService_ImportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ImportSDNConfig", runtime.WithHTTPPathPattern("/import/{pid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ImportSDNConfig", runtime.WithHTTPPathPattern("/import/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -223,9 +179,7 @@ func RegisterConfigurationManagementServiceHandlerServer(ctx context.Context, mu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ConfigurationManagementService_ImportSDNConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -252,7 +206,6 @@ func RegisterConfigurationManagementServiceHandlerFromEndpoint(ctx context.Conte } }() }() - return RegisterConfigurationManagementServiceHandler(ctx, mux, conn) } @@ -268,14 +221,11 @@ func RegisterConfigurationManagementServiceHandler(ctx context.Context, mux *run // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "ConfigurationManagementServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterConfigurationManagementServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ConfigurationManagementServiceClient) error { - - mux.Handle("GET", pattern_ConfigurationManagementService_ExportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_ConfigurationManagementService_ExportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ExportSDNConfig", runtime.WithHTTPPathPattern("/export/{pid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ExportSDNConfig", runtime.WithHTTPPathPattern("/export/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -286,18 +236,13 @@ func RegisterConfigurationManagementServiceHandlerClient(ctx context.Context, mu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ConfigurationManagementService_ExportSDNConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_ConfigurationManagementService_ImportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_ConfigurationManagementService_ImportSDNConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ImportSDNConfig", runtime.WithHTTPPathPattern("/import/{pid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.configurationmanagement.ConfigurationManagementService/ImportSDNConfig", runtime.WithHTTPPathPattern("/import/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -308,22 +253,17 @@ func RegisterConfigurationManagementServiceHandlerClient(ctx context.Context, mu runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_ConfigurationManagementService_ImportSDNConfig_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( pattern_ConfigurationManagementService_ExportSDNConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"export", "pid"}, "")) - pattern_ConfigurationManagementService_ImportSDNConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"import", "pid"}, "")) ) var ( forward_ConfigurationManagementService_ExportSDNConfig_0 = runtime.ForwardResponseMessage - forward_ConfigurationManagementService_ImportSDNConfig_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/conflict/conflict.pb.go b/api/go/gosdn/conflict/conflict.pb.go index a1c9d5c44..89b844920 100755 --- a/api/go/gosdn/conflict/conflict.pb.go +++ b/api/go/gosdn/conflict/conflict.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/conflict/conflict.proto @@ -12,6 +12,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -22,11 +23,10 @@ const ( ) type Metadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ResourceVersion int64 `protobuf:"varint,1,opt,name=resourceVersion,proto3" json:"resourceVersion,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ResourceVersion int64 `protobuf:"varint,1,opt,name=resourceVersion,proto3" json:"resourceVersion,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Metadata) Reset() { @@ -68,7 +68,7 @@ func (x *Metadata) GetResourceVersion() int64 { var File_gosdn_conflict_conflict_proto protoreflect.FileDescriptor -var file_gosdn_conflict_conflict_proto_rawDesc = []byte{ +var file_gosdn_conflict_conflict_proto_rawDesc = string([]byte{ 0x0a, 0x1d, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x1a, @@ -82,16 +82,16 @@ var file_gosdn_conflict_conflict_proto_rawDesc = []byte{ 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_conflict_conflict_proto_rawDescOnce sync.Once - file_gosdn_conflict_conflict_proto_rawDescData = file_gosdn_conflict_conflict_proto_rawDesc + file_gosdn_conflict_conflict_proto_rawDescData []byte ) func file_gosdn_conflict_conflict_proto_rawDescGZIP() []byte { file_gosdn_conflict_conflict_proto_rawDescOnce.Do(func() { - file_gosdn_conflict_conflict_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_conflict_conflict_proto_rawDescData) + file_gosdn_conflict_conflict_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_conflict_conflict_proto_rawDesc), len(file_gosdn_conflict_conflict_proto_rawDesc))) }) return file_gosdn_conflict_conflict_proto_rawDescData } @@ -117,7 +117,7 @@ func file_gosdn_conflict_conflict_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_conflict_conflict_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_conflict_conflict_proto_rawDesc), len(file_gosdn_conflict_conflict_proto_rawDesc)), NumEnums: 0, NumMessages: 1, NumExtensions: 0, @@ -128,7 +128,6 @@ func file_gosdn_conflict_conflict_proto_init() { MessageInfos: file_gosdn_conflict_conflict_proto_msgTypes, }.Build() File_gosdn_conflict_conflict_proto = out.File - file_gosdn_conflict_conflict_proto_rawDesc = nil file_gosdn_conflict_conflict_proto_goTypes = nil file_gosdn_conflict_conflict_proto_depIdxs = nil } diff --git a/api/go/gosdn/csbi/csbi.pb.go b/api/go/gosdn/csbi/csbi.pb.go index 55f5c6d63..39d930645 100755 --- a/api/go/gosdn/csbi/csbi.pb.go +++ b/api/go/gosdn/csbi/csbi.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/csbi/csbi.proto @@ -13,6 +13,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -81,13 +82,12 @@ func (State) EnumDescriptor() ([]byte, []int) { } type Syn struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Syn) Reset() { @@ -142,12 +142,11 @@ func (x *Syn) GetAddress() string { } type Ack struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. TransportOption *transport.TransportOption `protobuf:"bytes,2,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Ack) Reset() { @@ -195,13 +194,12 @@ func (x *Ack) GetTransportOption() *transport.TransportOption { } type GetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + All bool `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"` + Did []string `protobuf:"bytes,3,rep,name=did,proto3" json:"did,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - All bool `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"` - Did []string `protobuf:"bytes,3,rep,name=did,proto3" json:"did,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRequest) Reset() { @@ -256,13 +254,12 @@ func (x *GetRequest) GetDid() []string { } type GetPayloadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Did string `protobuf:"bytes,2,opt,name=did,proto3" json:"did,omitempty"` + File string `protobuf:"bytes,3,opt,name=file,proto3" json:"file,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Did string `protobuf:"bytes,2,opt,name=did,proto3" json:"did,omitempty"` - File string `protobuf:"bytes,3,opt,name=file,proto3" json:"file,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetPayloadRequest) Reset() { @@ -317,12 +314,11 @@ func (x *GetPayloadRequest) GetFile() string { } type GetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Deployments []*Deployment `protobuf:"bytes,2,rep,name=deployments,proto3" json:"deployments,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Deployments []*Deployment `protobuf:"bytes,2,rep,name=deployments,proto3" json:"deployments,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetResponse) Reset() { @@ -370,13 +366,12 @@ func (x *GetResponse) GetDeployments() []*Deployment { } type Deployment struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + State State `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.csbi.State" json:"state,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - State State `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.csbi.State" json:"state,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Deployment) Reset() { @@ -431,12 +426,11 @@ func (x *Deployment) GetState() State { } type CreateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. TransportOption []*transport.TransportOption `protobuf:"bytes,2,rep,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateRequest) Reset() { @@ -484,12 +478,11 @@ func (x *CreateRequest) GetTransportOption() []*transport.TransportOption { } type CreateResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Deployments []*Deployment `protobuf:"bytes,2,rep,name=deployments,proto3" json:"deployments,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Deployments []*Deployment `protobuf:"bytes,2,rep,name=deployments,proto3" json:"deployments,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateResponse) Reset() { @@ -537,11 +530,10 @@ func (x *CreateResponse) GetDeployments() []*Deployment { } type Payload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` unknownFields protoimpl.UnknownFields - - Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Payload) Reset() { @@ -582,12 +574,11 @@ func (x *Payload) GetChunk() []byte { } type DeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Did []string `protobuf:"bytes,2,rep,name=did,proto3" json:"did,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Did []string `protobuf:"bytes,2,rep,name=did,proto3" json:"did,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRequest) Reset() { @@ -635,11 +626,10 @@ func (x *DeleteRequest) GetDid() []string { } type DeleteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *DeleteResponse) Reset() { @@ -681,7 +671,7 @@ func (x *DeleteResponse) GetTimestamp() int64 { var File_gosdn_csbi_csbi_proto protoreflect.FileDescriptor -var file_gosdn_csbi_csbi_proto_rawDesc = []byte{ +var file_gosdn_csbi_csbi_proto_rawDesc = string([]byte{ 0x0a, 0x15, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x73, 0x62, 0x69, 0x2f, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, @@ -786,16 +776,16 @@ var file_gosdn_csbi_csbi_proto_rawDesc = []byte{ 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x73, 0x62, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_csbi_csbi_proto_rawDescOnce sync.Once - file_gosdn_csbi_csbi_proto_rawDescData = file_gosdn_csbi_csbi_proto_rawDesc + file_gosdn_csbi_csbi_proto_rawDescData []byte ) func file_gosdn_csbi_csbi_proto_rawDescGZIP() []byte { file_gosdn_csbi_csbi_proto_rawDescOnce.Do(func() { - file_gosdn_csbi_csbi_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_csbi_csbi_proto_rawDescData) + file_gosdn_csbi_csbi_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_csbi_csbi_proto_rawDesc), len(file_gosdn_csbi_csbi_proto_rawDesc))) }) return file_gosdn_csbi_csbi_proto_rawDescData } @@ -851,7 +841,7 @@ func file_gosdn_csbi_csbi_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_csbi_csbi_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_csbi_csbi_proto_rawDesc), len(file_gosdn_csbi_csbi_proto_rawDesc)), NumEnums: 1, NumMessages: 11, NumExtensions: 0, @@ -863,7 +853,6 @@ func file_gosdn_csbi_csbi_proto_init() { MessageInfos: file_gosdn_csbi_csbi_proto_msgTypes, }.Build() File_gosdn_csbi_csbi_proto = out.File - file_gosdn_csbi_csbi_proto_rawDesc = nil file_gosdn_csbi_csbi_proto_goTypes = nil file_gosdn_csbi_csbi_proto_depIdxs = nil } diff --git a/api/go/gosdn/networkelement/networkelement.pb.go b/api/go/gosdn/networkelement/networkelement.pb.go index a58431fdb..17e66647e 100755 --- a/api/go/gosdn/networkelement/networkelement.pb.go +++ b/api/go/gosdn/networkelement/networkelement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/networkelement/networkelement.proto @@ -19,6 +19,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -293,12 +294,11 @@ func (StreamMode) EnumDescriptor() ([]byte, []int) { // TODO: change name to fit the rest type UpdateNetworkElementRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` NetworkElement *ManagedNetworkElement `protobuf:"bytes,2,opt,name=network_element,json=networkElement,proto3" json:"network_element,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateNetworkElementRequest) Reset() { @@ -346,11 +346,10 @@ func (x *UpdateNetworkElementRequest) GetNetworkElement() *ManagedNetworkElement } type UpdateNetworkElementResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateNetworkElementResponse) Reset() { @@ -391,10 +390,7 @@ func (x *UpdateNetworkElementResponse) GetTimestamp() int64 { } type ManagedNetworkElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` Model string `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"` @@ -405,6 +401,8 @@ type ManagedNetworkElement struct { Metadata *conflict.Metadata `protobuf:"bytes,8,opt,name=metadata,proto3" json:"metadata,omitempty"` AssociatedPnd string `protobuf:"bytes,9,opt,name=associated_pnd,json=associatedPnd,proto3" json:"associated_pnd,omitempty"` GnmiSubscribePaths []string `protobuf:"bytes,10,rep,name=gnmi_subscribe_paths,json=gnmiSubscribePaths,proto3" json:"gnmi_subscribe_paths,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ManagedNetworkElement) Reset() { @@ -508,14 +506,13 @@ func (x *ManagedNetworkElement) GetGnmiSubscribePaths() []string { } type FlattenedManagedNetworkElement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + Pluginid string `protobuf:"bytes,4,opt,name=pluginid,proto3" json:"pluginid,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` - Pluginid string `protobuf:"bytes,4,opt,name=pluginid,proto3" json:"pluginid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *FlattenedManagedNetworkElement) Reset() { @@ -577,12 +574,11 @@ func (x *FlattenedManagedNetworkElement) GetPluginid() string { } type GetAllRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetAllRequest) Reset() { @@ -630,15 +626,14 @@ func (x *GetAllRequest) GetPid() string { } type GetAllResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. // TODO: Check if this is really needed. Perhaps a reference to the PND's ID // is also sufficient. - Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Mne []*ManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` + Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Mne []*ManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetAllResponse) Reset() { @@ -693,12 +688,11 @@ func (x *GetAllResponse) GetMne() []*ManagedNetworkElement { } type GetAllFlattenedRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetAllFlattenedRequest) Reset() { @@ -746,15 +740,14 @@ func (x *GetAllFlattenedRequest) GetPid() string { } type GetAllFlattenedResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. // TODO: Check if this is really needed. Perhaps a reference to the PND's ID // is also sufficient. - Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Mne []*FlattenedManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` + Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Mne []*FlattenedManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetAllFlattenedResponse) Reset() { @@ -809,12 +802,11 @@ func (x *GetAllFlattenedResponse) GetMne() []*FlattenedManagedNetworkElement { } type ParseYangRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Yang string `protobuf:"bytes,2,opt,name=yang,proto3" json:"yang,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Yang string `protobuf:"bytes,2,opt,name=yang,proto3" json:"yang,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ParseYangRequest) Reset() { @@ -862,12 +854,11 @@ func (x *ParseYangRequest) GetYang() string { } type ParseYangResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Json string `protobuf:"bytes,2,opt,name=json,proto3" json:"json,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Json string `protobuf:"bytes,2,opt,name=json,proto3" json:"json,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ParseYangResponse) Reset() { @@ -915,13 +906,12 @@ func (x *ParseYangResponse) GetJson() string { } type GetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRequest) Reset() { @@ -976,15 +966,14 @@ func (x *GetRequest) GetPid() string { } type GetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. // TODO: Check if this is really needed. Perhaps a reference to the PND's ID // is also sufficient. - Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Mne *ManagedNetworkElement `protobuf:"bytes,3,opt,name=mne,proto3" json:"mne,omitempty"` + Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Mne *ManagedNetworkElement `protobuf:"bytes,3,opt,name=mne,proto3" json:"mne,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetResponse) Reset() { @@ -1039,13 +1028,12 @@ func (x *GetResponse) GetMne() *ManagedNetworkElement { } type GetFlattenedRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetFlattenedRequest) Reset() { @@ -1100,15 +1088,14 @@ func (x *GetFlattenedRequest) GetPid() string { } type GetFlattenedResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. // TODO: Check if this is really needed. Perhaps a reference to the PND's ID // is also sufficient. - Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Mne *FlattenedManagedNetworkElement `protobuf:"bytes,3,opt,name=mne,proto3" json:"mne,omitempty"` + Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Mne *FlattenedManagedNetworkElement `protobuf:"bytes,3,opt,name=mne,proto3" json:"mne,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetFlattenedResponse) Reset() { @@ -1163,10 +1150,7 @@ func (x *GetFlattenedResponse) GetMne() *FlattenedManagedNetworkElement { } type SetMne struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` PluginId string `protobuf:"bytes,3,opt,name=pluginId,proto3" json:"pluginId,omitempty"` @@ -1174,6 +1158,8 @@ type SetMne struct { TransportOption *transport.TransportOption `protobuf:"bytes,5,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"` GnmiSubscribePaths []string `protobuf:"bytes,6,rep,name=gnmi_subscribe_paths,json=gnmiSubscribePaths,proto3" json:"gnmi_subscribe_paths,omitempty"` MneId string `protobuf:"bytes,7,opt,name=mne_id,json=mneId,proto3" json:"mne_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SetMne) Reset() { @@ -1256,13 +1242,12 @@ func (x *SetMne) GetMneId() string { } type AddListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Mne []*SetMne `protobuf:"bytes,2,rep,name=mne,proto3" json:"mne,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Mne []*SetMne `protobuf:"bytes,2,rep,name=mne,proto3" json:"mne,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddListRequest) Reset() { @@ -1317,12 +1302,11 @@ func (x *AddListRequest) GetPid() string { } type AddListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Responses []*SetResponse `protobuf:"bytes,2,rep,name=responses,proto3" json:"responses,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Responses []*SetResponse `protobuf:"bytes,2,rep,name=responses,proto3" json:"responses,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddListResponse) Reset() { @@ -1370,14 +1354,13 @@ func (x *AddListResponse) GetResponses() []*SetResponse { } type GetPathRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` + Pid string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` - Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` - Pid string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetPathRequest) Reset() { @@ -1439,15 +1422,14 @@ func (x *GetPathRequest) GetPid() string { } type GetPathResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. // TODO: Check if this is really needed. Perhaps a reference to the PND's ID // is also sufficient. Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` MneNotification []*gnmi.Notification `protobuf:"bytes,3,rep,name=mne_notification,json=mneNotification,proto3" json:"mne_notification,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetPathResponse) Reset() { @@ -1502,14 +1484,13 @@ func (x *GetPathResponse) GetMneNotification() []*gnmi.Notification { } type GetIntendedPathRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` + IntendedPath string `protobuf:"bytes,3,opt,name=intended_path,json=intendedPath,proto3" json:"intended_path,omitempty"` + Pid string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` - IntendedPath string `protobuf:"bytes,3,opt,name=intended_path,json=intendedPath,proto3" json:"intended_path,omitempty"` - Pid string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetIntendedPathRequest) Reset() { @@ -1571,13 +1552,12 @@ func (x *GetIntendedPathRequest) GetPid() string { } type GetIntendedPathResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Timestamp int64 `protobuf:"varint,64,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` MneNotification []*gnmi.Notification `protobuf:"bytes,3,rep,name=mne_notification,json=mneNotification,proto3" json:"mne_notification,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetIntendedPathResponse) Reset() { @@ -1632,12 +1612,11 @@ func (x *GetIntendedPathResponse) GetMneNotification() []*gnmi.Notification { } type SetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetResponse) Reset() { @@ -1685,13 +1664,12 @@ func (x *SetResponse) GetId() string { } type SetPathListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + ChangeRequest []*ChangeRequest `protobuf:"bytes,2,rep,name=change_request,json=changeRequest,proto3" json:"change_request,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - ChangeRequest []*ChangeRequest `protobuf:"bytes,2,rep,name=change_request,json=changeRequest,proto3" json:"change_request,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetPathListRequest) Reset() { @@ -1746,12 +1724,11 @@ func (x *SetPathListRequest) GetPid() string { } type SetPathListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Responses []*SetResponse `protobuf:"bytes,2,rep,name=responses,proto3" json:"responses,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Responses []*SetResponse `protobuf:"bytes,2,rep,name=responses,proto3" json:"responses,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetPathListResponse) Reset() { @@ -1799,13 +1776,12 @@ func (x *SetPathListResponse) GetResponses() []*SetResponse { } type DeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + Mneid string `protobuf:"bytes,3,opt,name=mneid,proto3" json:"mneid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` - Mneid string `protobuf:"bytes,3,opt,name=mneid,proto3" json:"mneid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRequest) Reset() { @@ -1860,11 +1836,10 @@ func (x *DeleteRequest) GetMneid() string { } type DeleteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *DeleteResponse) Reset() { @@ -1905,14 +1880,13 @@ func (x *DeleteResponse) GetTimestamp() int64 { } type Change struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Age int64 `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"` + State ChangeState `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.networkelement.ChangeState" json:"state,omitempty"` + Diff *gnmi.Notification `protobuf:"bytes,4,opt,name=diff,proto3" json:"diff,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Age int64 `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"` - State ChangeState `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.networkelement.ChangeState" json:"state,omitempty"` - Diff *gnmi.Notification `protobuf:"bytes,4,opt,name=diff,proto3" json:"diff,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Change) Reset() { @@ -1974,14 +1948,13 @@ func (x *Change) GetDiff() *gnmi.Notification { } type ChangeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Mneid string `protobuf:"bytes,1,opt,name=mneid,proto3" json:"mneid,omitempty"` + Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + ApiOp ApiOperation `protobuf:"varint,4,opt,name=api_op,json=apiOp,proto3,enum=gosdn.networkelement.ApiOperation" json:"api_op,omitempty"` unknownFields protoimpl.UnknownFields - - Mneid string `protobuf:"bytes,1,opt,name=mneid,proto3" json:"mneid,omitempty"` - Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - ApiOp ApiOperation `protobuf:"varint,4,opt,name=api_op,json=apiOp,proto3,enum=gosdn.networkelement.ApiOperation" json:"api_op,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ChangeRequest) Reset() { @@ -2043,12 +2016,11 @@ func (x *ChangeRequest) GetApiOp() ApiOperation { } type SetChange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Cuid string `protobuf:"bytes,1,opt,name=cuid,proto3" json:"cuid,omitempty"` + Op Operation `protobuf:"varint,2,opt,name=op,proto3,enum=gosdn.networkelement.Operation" json:"op,omitempty"` unknownFields protoimpl.UnknownFields - - Cuid string `protobuf:"bytes,1,opt,name=cuid,proto3" json:"cuid,omitempty"` - Op Operation `protobuf:"varint,2,opt,name=op,proto3,enum=gosdn.networkelement.Operation" json:"op,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetChange) Reset() { @@ -2096,12 +2068,11 @@ func (x *SetChange) GetOp() Operation { } type GetChangeListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetChangeListRequest) Reset() { @@ -2149,15 +2120,14 @@ func (x *GetChangeListRequest) GetPid() string { } type GetChangeListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. // TODO: Check if this is really needed. Perhaps a reference to the PND's ID // is also sufficient. - Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Change []*Change `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"` + Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Change []*Change `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetChangeListResponse) Reset() { @@ -2212,13 +2182,12 @@ func (x *GetChangeListResponse) GetChange() []*Change { } type GetChangeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Cuid []string `protobuf:"bytes,2,rep,name=cuid,proto3" json:"cuid,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Cuid []string `protobuf:"bytes,2,rep,name=cuid,proto3" json:"cuid,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetChangeRequest) Reset() { @@ -2273,15 +2242,14 @@ func (x *GetChangeRequest) GetPid() string { } type GetChangeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. // TODO: Check if this is really needed. Perhaps a reference to the PND's ID // is also sufficient. - Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Change []*Change `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"` + Pnd *pnd.PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Change []*Change `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetChangeResponse) Reset() { @@ -2336,13 +2304,12 @@ func (x *GetChangeResponse) GetChange() []*Change { } type SetChangeListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Change []*SetChange `protobuf:"bytes,2,rep,name=change,proto3" json:"change,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Change []*SetChange `protobuf:"bytes,2,rep,name=change,proto3" json:"change,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetChangeListRequest) Reset() { @@ -2397,12 +2364,11 @@ func (x *SetChangeListRequest) GetPid() string { } type SetChangeListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Responses []*SetResponse `protobuf:"bytes,2,rep,name=responses,proto3" json:"responses,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Responses []*SetResponse `protobuf:"bytes,2,rep,name=responses,proto3" json:"responses,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetChangeListResponse) Reset() { @@ -2452,12 +2418,11 @@ func (x *SetChangeListResponse) GetResponses() []*SetResponse { // The mode determines how the target should trigger updates to be sent. // Reference: gNMI Specification Section 3.5.1.2 type SubscriptionList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Subscription []*Subscription `protobuf:"bytes,1,rep,name=subscription,proto3" json:"subscription,omitempty"` + Mode SubscriptionMode `protobuf:"varint,2,opt,name=mode,proto3,enum=gosdn.networkelement.SubscriptionMode" json:"mode,omitempty"` unknownFields protoimpl.UnknownFields - - Subscription []*Subscription `protobuf:"bytes,1,rep,name=subscription,proto3" json:"subscription,omitempty"` - Mode SubscriptionMode `protobuf:"varint,2,opt,name=mode,proto3,enum=gosdn.networkelement.SubscriptionMode" json:"mode,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SubscriptionList) Reset() { @@ -2505,13 +2470,12 @@ func (x *SubscriptionList) GetMode() SubscriptionMode { } type Subscription struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - StreamMode StreamMode `protobuf:"varint,2,opt,name=stream_mode,json=streamMode,proto3,enum=gosdn.networkelement.StreamMode" json:"stream_mode,omitempty"` - SampleInterval uint64 `protobuf:"varint,3,opt,name=sample_interval,json=sampleInterval,proto3" json:"sample_interval,omitempty"` // time in ns between samples in SAMPLE mode. + state protoimpl.MessageState `protogen:"open.v1"` + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + StreamMode StreamMode `protobuf:"varint,2,opt,name=stream_mode,json=streamMode,proto3,enum=gosdn.networkelement.StreamMode" json:"stream_mode,omitempty"` + SampleInterval uint64 `protobuf:"varint,3,opt,name=sample_interval,json=sampleInterval,proto3" json:"sample_interval,omitempty"` // time in ns between samples in SAMPLE mode. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Subscription) Reset() { @@ -2566,14 +2530,13 @@ func (x *Subscription) GetSampleInterval() uint64 { } type SubscribePathRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + Sublist *SubscriptionList `protobuf:"bytes,4,opt,name=sublist,proto3" json:"sublist,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` - Sublist *SubscriptionList `protobuf:"bytes,4,opt,name=sublist,proto3" json:"sublist,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SubscribePathRequest) Reset() { @@ -2635,12 +2598,11 @@ func (x *SubscribePathRequest) GetSublist() *SubscriptionList { } type SubscribePathResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - MneNotification []*gnmi.Notification `protobuf:"bytes,2,rep,name=mne_notification,json=mneNotification,proto3" json:"mne_notification,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + MneNotification []*gnmi.Notification `protobuf:"bytes,2,rep,name=mne_notification,json=mneNotification,proto3" json:"mne_notification,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SubscribePathResponse) Reset() { @@ -2689,7 +2651,7 @@ func (x *SubscribePathResponse) GetMneNotification() []*gnmi.Notification { var File_gosdn_networkelement_networkelement_proto protoreflect.FileDescriptor -var file_gosdn_networkelement_networkelement_proto_rawDesc = []byte{ +var file_gosdn_networkelement_networkelement_proto_rawDesc = string([]byte{ 0x0a, 0x29, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x73, @@ -3212,16 +3174,16 @@ var file_gosdn_networkelement_networkelement_proto_rawDesc = []byte{ 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_networkelement_networkelement_proto_rawDescOnce sync.Once - file_gosdn_networkelement_networkelement_proto_rawDescData = file_gosdn_networkelement_networkelement_proto_rawDesc + file_gosdn_networkelement_networkelement_proto_rawDescData []byte ) func file_gosdn_networkelement_networkelement_proto_rawDescGZIP() []byte { file_gosdn_networkelement_networkelement_proto_rawDescOnce.Do(func() { - file_gosdn_networkelement_networkelement_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_networkelement_networkelement_proto_rawDescData) + file_gosdn_networkelement_networkelement_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_networkelement_networkelement_proto_rawDesc), len(file_gosdn_networkelement_networkelement_proto_rawDesc))) }) return file_gosdn_networkelement_networkelement_proto_rawDescData } @@ -3367,7 +3329,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_networkelement_networkelement_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_networkelement_networkelement_proto_rawDesc), len(file_gosdn_networkelement_networkelement_proto_rawDesc)), NumEnums: 5, NumMessages: 39, NumExtensions: 0, @@ -3379,7 +3341,6 @@ func file_gosdn_networkelement_networkelement_proto_init() { MessageInfos: file_gosdn_networkelement_networkelement_proto_msgTypes, }.Build() File_gosdn_networkelement_networkelement_proto = out.File - file_gosdn_networkelement_networkelement_proto_rawDesc = nil file_gosdn_networkelement_networkelement_proto_goTypes = nil file_gosdn_networkelement_networkelement_proto_depIdxs = nil } diff --git a/api/go/gosdn/networkelement/networkelement.pb.gw.go b/api/go/gosdn/networkelement/networkelement.pb.gw.go index 642198688..409a3a5a4 100755 --- a/api/go/gosdn/networkelement/networkelement.pb.gw.go +++ b/api/go/gosdn/networkelement/networkelement.pb.gw.go @@ -10,6 +10,7 @@ package networkelement import ( "context" + "errors" "io" "net/http" @@ -24,613 +25,488 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_NetworkElementService_Update_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateNetworkElementRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateNetworkElementRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Update(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_Update_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateNetworkElementRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateNetworkElementRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Update(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_GetAllFlattened_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_NetworkElementService_GetAllFlattened_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_NetworkElementService_GetAllFlattened_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAllFlattenedRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetAllFlattenedRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetAllFlattened_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetAllFlattened(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_GetAllFlattened_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAllFlattenedRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetAllFlattenedRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetAllFlattened_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetAllFlattened(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_Get_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_NetworkElementService_Get_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_NetworkElementService_Get_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_Get_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Get(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_Get_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_Get_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Get(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_ParseYang_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_NetworkElementService_ParseYang_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_NetworkElementService_ParseYang_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ParseYangRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ParseYangRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_ParseYang_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ParseYang(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_ParseYang_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ParseYangRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ParseYangRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_ParseYang_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ParseYang(ctx, &protoReq) return msg, metadata, err - } func request_NetworkElementService_AddList_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AddList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_AddList_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AddList(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_GetPath_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0, "path": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_NetworkElementService_GetPath_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0, "path": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_NetworkElementService_GetPath_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPathRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetPathRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - val, ok = pathParams["path"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "path") } - protoReq.Path, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "path", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetPath_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetPath(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_GetPath_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPathRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetPathRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - val, ok = pathParams["path"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "path") } - protoReq.Path, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "path", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetPath_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetPath(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_GetIntendedPath_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0, "intended_path": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} -) +var filter_NetworkElementService_GetIntendedPath_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0, "intended_path": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} func request_NetworkElementService_GetIntendedPath_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetIntendedPathRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetIntendedPathRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - val, ok = pathParams["intended_path"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "intended_path") } - protoReq.IntendedPath, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "intended_path", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetIntendedPath_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetIntendedPath(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_GetIntendedPath_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetIntendedPathRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetIntendedPathRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - val, ok = pathParams["intended_path"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "intended_path") } - protoReq.IntendedPath, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "intended_path", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetIntendedPath_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetIntendedPath(ctx, &protoReq) return msg, metadata, err - } func request_NetworkElementService_SetPathList_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq SetPathListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq SetPathListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.SetPathList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_SetPathList_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq SetPathListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq SetPathListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.SetPathList(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_Delete_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_NetworkElementService_Delete_0 = &utilities.DoubleArray{Encoding: map[string]int{"mneid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_NetworkElementService_Delete_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_Delete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Delete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_Delete_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_Delete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Delete(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_GetChangeList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_NetworkElementService_GetChangeList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_NetworkElementService_GetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetChangeListRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetChangeListRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetChangeList_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetChangeList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_GetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetChangeListRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetChangeListRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetChangeList_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetChangeList(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_NetworkElementService_GetChange_0 = &utilities.DoubleArray{Encoding: map[string]int{"cuid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_NetworkElementService_GetChange_0 = &utilities.DoubleArray{Encoding: map[string]int{"cuid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_NetworkElementService_GetChange_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetChangeRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetChangeRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["cuid"] + val, ok := pathParams["cuid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cuid") } - protoReq.Cuid, err = runtime.StringSlice(val, ",") if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cuid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetChange_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetChange(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_GetChange_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetChangeRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetChangeRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["cuid"] + val, ok := pathParams["cuid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cuid") } - protoReq.Cuid, err = runtime.StringSlice(val, ",") if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cuid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetChange_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetChange(ctx, &protoReq) return msg, metadata, err - } func request_NetworkElementService_SetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq SetChangeListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq SetChangeListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.SetChangeList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_NetworkElementService_SetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq SetChangeListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq SetChangeListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.SetChangeList(ctx, &protoReq) return msg, metadata, err - } // RegisterNetworkElementServiceHandlerServer registers the http handlers for service NetworkElementService to "mux". @@ -639,16 +515,13 @@ func local_request_NetworkElementService_SetChangeList_0(ctx context.Context, ma // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterNetworkElementServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server NetworkElementServiceServer) error { - - mux.Handle("POST", pattern_NetworkElementService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Update", runtime.WithHTTPPathPattern("/network-element/update")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Update", runtime.WithHTTPPathPattern("/network-element/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -660,20 +533,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_Update_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetAllFlattened_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetAllFlattened_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetAllFlattened", runtime.WithHTTPPathPattern("/mnes")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetAllFlattened", runtime.WithHTTPPathPattern("/mnes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -685,20 +553,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetAllFlattened_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Get", runtime.WithHTTPPathPattern("/mnes/{mneid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Get", runtime.WithHTTPPathPattern("/mnes/{mneid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -710,20 +573,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -735,20 +593,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_ParseYang_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/AddList", runtime.WithHTTPPathPattern("/mnes")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/AddList", runtime.WithHTTPPathPattern("/mnes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -760,20 +613,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_AddList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/paths/{path}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/paths/{path}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -785,20 +633,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetPath_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetIntendedPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetIntendedPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetIntendedPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/intendedpaths/{intended_path}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetIntendedPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/intendedpaths/{intended_path}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -810,20 +653,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetIntendedPath_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_NetworkElementService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetPathList", runtime.WithHTTPPathPattern("/mnes/paths")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetPathList", runtime.WithHTTPPathPattern("/mnes/paths")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -835,20 +673,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_SetPathList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_NetworkElementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_NetworkElementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Delete", runtime.WithHTTPPathPattern("/mnes/{mneid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Delete", runtime.WithHTTPPathPattern("/mnes/{mneid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -860,20 +693,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_Delete_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -885,20 +713,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetChangeList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChange", runtime.WithHTTPPathPattern("/mnes/changes/{cuid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChange", runtime.WithHTTPPathPattern("/mnes/changes/{cuid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -910,20 +733,15 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetChange_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_NetworkElementService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -935,9 +753,7 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_SetChangeList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -964,7 +780,6 @@ func RegisterNetworkElementServiceHandlerFromEndpoint(ctx context.Context, mux * } }() }() - return RegisterNetworkElementServiceHandler(ctx, mux, conn) } @@ -980,14 +795,11 @@ func RegisterNetworkElementServiceHandler(ctx context.Context, mux *runtime.Serv // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "NetworkElementServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client NetworkElementServiceClient) error { - - mux.Handle("POST", pattern_NetworkElementService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Update", runtime.WithHTTPPathPattern("/network-element/update")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Update", runtime.WithHTTPPathPattern("/network-element/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -998,18 +810,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_Update_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetAllFlattened_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetAllFlattened_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetAllFlattened", runtime.WithHTTPPathPattern("/mnes")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetAllFlattened", runtime.WithHTTPPathPattern("/mnes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1020,18 +827,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetAllFlattened_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Get", runtime.WithHTTPPathPattern("/mnes/{mneid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Get", runtime.WithHTTPPathPattern("/mnes/{mneid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1042,18 +844,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1064,18 +861,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_ParseYang_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/AddList", runtime.WithHTTPPathPattern("/mnes")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/AddList", runtime.WithHTTPPathPattern("/mnes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1086,18 +878,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_AddList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/paths/{path}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/paths/{path}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1108,18 +895,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetPath_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetIntendedPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetIntendedPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetIntendedPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/intendedpaths/{intended_path}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetIntendedPath", runtime.WithHTTPPathPattern("/mnes/{mneid}/intendedpaths/{intended_path}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1130,18 +912,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetIntendedPath_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_NetworkElementService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetPathList", runtime.WithHTTPPathPattern("/mnes/paths")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetPathList", runtime.WithHTTPPathPattern("/mnes/paths")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1152,18 +929,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_SetPathList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_NetworkElementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_NetworkElementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Delete", runtime.WithHTTPPathPattern("/mnes/{mneid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Delete", runtime.WithHTTPPathPattern("/mnes/{mneid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1174,18 +946,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_Delete_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1196,18 +963,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetChangeList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_NetworkElementService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_NetworkElementService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChange", runtime.WithHTTPPathPattern("/mnes/changes/{cuid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetChange", runtime.WithHTTPPathPattern("/mnes/changes/{cuid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1218,18 +980,13 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_GetChange_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_NetworkElementService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_NetworkElementService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/SetChangeList", runtime.WithHTTPPathPattern("/mnes/changes")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1240,62 +997,37 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_NetworkElementService_SetChangeList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_NetworkElementService_Update_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"network-element", "update"}, "")) - + pattern_NetworkElementService_Update_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"network-element", "update"}, "")) pattern_NetworkElementService_GetAllFlattened_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"mnes"}, "")) - - pattern_NetworkElementService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"mnes", "mneid"}, "")) - - pattern_NetworkElementService_ParseYang_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"yang", "parse"}, "")) - - pattern_NetworkElementService_AddList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"mnes"}, "")) - - pattern_NetworkElementService_GetPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"mnes", "mneid", "paths", "path"}, "")) - + pattern_NetworkElementService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"mnes", "mneid"}, "")) + pattern_NetworkElementService_ParseYang_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"yang", "parse"}, "")) + pattern_NetworkElementService_AddList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"mnes"}, "")) + pattern_NetworkElementService_GetPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"mnes", "mneid", "paths", "path"}, "")) pattern_NetworkElementService_GetIntendedPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"mnes", "mneid", "intendedpaths", "intended_path"}, "")) - - pattern_NetworkElementService_SetPathList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"mnes", "paths"}, "")) - - pattern_NetworkElementService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"mnes", "mneid"}, "")) - - pattern_NetworkElementService_GetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"mnes", "changes"}, "")) - - pattern_NetworkElementService_GetChange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"mnes", "changes", "cuid"}, "")) - - pattern_NetworkElementService_SetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"mnes", "changes"}, "")) + pattern_NetworkElementService_SetPathList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"mnes", "paths"}, "")) + pattern_NetworkElementService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"mnes", "mneid"}, "")) + pattern_NetworkElementService_GetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"mnes", "changes"}, "")) + pattern_NetworkElementService_GetChange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"mnes", "changes", "cuid"}, "")) + pattern_NetworkElementService_SetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"mnes", "changes"}, "")) ) var ( - forward_NetworkElementService_Update_0 = runtime.ForwardResponseMessage - + forward_NetworkElementService_Update_0 = runtime.ForwardResponseMessage forward_NetworkElementService_GetAllFlattened_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_Get_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_ParseYang_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_AddList_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_GetPath_0 = runtime.ForwardResponseMessage - + forward_NetworkElementService_Get_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_ParseYang_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_AddList_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_GetPath_0 = runtime.ForwardResponseMessage forward_NetworkElementService_GetIntendedPath_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_SetPathList_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_Delete_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_GetChangeList_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_GetChange_0 = runtime.ForwardResponseMessage - - forward_NetworkElementService_SetChangeList_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_SetPathList_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_Delete_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_GetChangeList_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_GetChange_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_SetChangeList_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/plugin-internal/plugin-internal.pb.go b/api/go/gosdn/plugin-internal/plugin-internal.pb.go index 490d4f78c..6d52ec6b0 100755 --- a/api/go/gosdn/plugin-internal/plugin-internal.pb.go +++ b/api/go/gosdn/plugin-internal/plugin-internal.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/plugin-internal/plugin-internal.proto @@ -9,10 +9,12 @@ package plugin_internal import ( _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" plugin_registry "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -23,11 +25,10 @@ const ( ) type GetAvailablePluginsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetAvailablePluginsRequest) Reset() { @@ -67,29 +68,28 @@ func (x *GetAvailablePluginsRequest) GetTimestamp() int64 { return 0 } -type GetAvailablePluginsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type GetPluginSchemaRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Plugins []*plugin_registry.Plugin `protobuf:"bytes,2,rep,name=plugins,proto3" json:"plugins,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetAvailablePluginsResponse) Reset() { - *x = GetAvailablePluginsResponse{} +func (x *GetPluginSchemaRequest) Reset() { + *x = GetPluginSchemaRequest{} mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetAvailablePluginsResponse) String() string { +func (x *GetPluginSchemaRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailablePluginsResponse) ProtoMessage() {} +func (*GetPluginSchemaRequest) ProtoMessage() {} -func (x *GetAvailablePluginsResponse) ProtoReflect() protoreflect.Message { +func (x *GetPluginSchemaRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -101,48 +101,46 @@ func (x *GetAvailablePluginsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAvailablePluginsResponse.ProtoReflect.Descriptor instead. -func (*GetAvailablePluginsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetPluginSchemaRequest.ProtoReflect.Descriptor instead. +func (*GetPluginSchemaRequest) Descriptor() ([]byte, []int) { return file_gosdn_plugin_internal_plugin_internal_proto_rawDescGZIP(), []int{1} } -func (x *GetAvailablePluginsResponse) GetTimestamp() int64 { +func (x *GetPluginSchemaRequest) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *GetAvailablePluginsResponse) GetPlugins() []*plugin_registry.Plugin { +func (x *GetPluginSchemaRequest) GetPid() string { if x != nil { - return x.Plugins + return x.Pid } - return nil + return "" } -type GetPluginSchemaRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type PluginSchemaPayload struct { + state protoimpl.MessageState `protogen:"open.v1"` + Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *GetPluginSchemaRequest) Reset() { - *x = GetPluginSchemaRequest{} +func (x *PluginSchemaPayload) Reset() { + *x = PluginSchemaPayload{} mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetPluginSchemaRequest) String() string { +func (x *PluginSchemaPayload) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPluginSchemaRequest) ProtoMessage() {} +func (*PluginSchemaPayload) ProtoMessage() {} -func (x *GetPluginSchemaRequest) ProtoReflect() protoreflect.Message { +func (x *PluginSchemaPayload) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -154,47 +152,40 @@ func (x *GetPluginSchemaRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetPluginSchemaRequest.ProtoReflect.Descriptor instead. -func (*GetPluginSchemaRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use PluginSchemaPayload.ProtoReflect.Descriptor instead. +func (*PluginSchemaPayload) Descriptor() ([]byte, []int) { return file_gosdn_plugin_internal_plugin_internal_proto_rawDescGZIP(), []int{2} } -func (x *GetPluginSchemaRequest) GetTimestamp() int64 { - if x != nil { - return x.Timestamp - } - return 0 -} - -func (x *GetPluginSchemaRequest) GetPid() string { +func (x *PluginSchemaPayload) GetChunk() []byte { if x != nil { - return x.Pid + return x.Chunk } - return "" + return nil } -type PluginSchemaPayload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type GetAvailablePluginsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Plugins []*plugin_registry.Plugin `protobuf:"bytes,2,rep,name=plugins,proto3" json:"plugins,omitempty"` unknownFields protoimpl.UnknownFields - - Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` + sizeCache protoimpl.SizeCache } -func (x *PluginSchemaPayload) Reset() { - *x = PluginSchemaPayload{} +func (x *GetAvailablePluginsResponse) Reset() { + *x = GetAvailablePluginsResponse{} mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PluginSchemaPayload) String() string { +func (x *GetAvailablePluginsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PluginSchemaPayload) ProtoMessage() {} +func (*GetAvailablePluginsResponse) ProtoMessage() {} -func (x *PluginSchemaPayload) ProtoReflect() protoreflect.Message { +func (x *GetAvailablePluginsResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -206,21 +197,28 @@ func (x *PluginSchemaPayload) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PluginSchemaPayload.ProtoReflect.Descriptor instead. -func (*PluginSchemaPayload) Descriptor() ([]byte, []int) { +// Deprecated: Use GetAvailablePluginsResponse.ProtoReflect.Descriptor instead. +func (*GetAvailablePluginsResponse) Descriptor() ([]byte, []int) { return file_gosdn_plugin_internal_plugin_internal_proto_rawDescGZIP(), []int{3} } -func (x *PluginSchemaPayload) GetChunk() []byte { +func (x *GetAvailablePluginsResponse) GetTimestamp() int64 { if x != nil { - return x.Chunk + return x.Timestamp + } + return 0 +} + +func (x *GetAvailablePluginsResponse) GetPlugins() []*plugin_registry.Plugin { + if x != nil { + return x.Plugins } return nil } var File_gosdn_plugin_internal_plugin_internal_proto protoreflect.FileDescriptor -var file_gosdn_plugin_internal_plugin_internal_proto_rawDesc = []byte{ +var file_gosdn_plugin_internal_plugin_internal_proto_rawDesc = string([]byte{ 0x0a, 0x2b, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, @@ -229,56 +227,66 @@ var file_gosdn_plugin_internal_plugin_internal_proto_rawDesc = []byte{ 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2b, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3a, - 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x74, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, - 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, - 0x22, 0x50, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3a, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, - 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x13, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x32, - 0xf2, 0x01, 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x31, 0x2e, - 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x30, 0x01, 0x42, 0x3b, 0x5a, 0x39, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, - 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x50, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, + 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x13, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x74, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x32, 0xf2, 0x02, + 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x31, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x73, 0x64, + 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x73, 0x42, 0x3b, 0x5a, 0x39, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, + 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +}) var ( file_gosdn_plugin_internal_plugin_internal_proto_rawDescOnce sync.Once - file_gosdn_plugin_internal_plugin_internal_proto_rawDescData = file_gosdn_plugin_internal_plugin_internal_proto_rawDesc + file_gosdn_plugin_internal_plugin_internal_proto_rawDescData []byte ) func file_gosdn_plugin_internal_plugin_internal_proto_rawDescGZIP() []byte { file_gosdn_plugin_internal_plugin_internal_proto_rawDescOnce.Do(func() { - file_gosdn_plugin_internal_plugin_internal_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_plugin_internal_plugin_internal_proto_rawDescData) + file_gosdn_plugin_internal_plugin_internal_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_plugin_internal_plugin_internal_proto_rawDesc), len(file_gosdn_plugin_internal_plugin_internal_proto_rawDesc))) }) return file_gosdn_plugin_internal_plugin_internal_proto_rawDescData } @@ -286,20 +294,22 @@ func file_gosdn_plugin_internal_plugin_internal_proto_rawDescGZIP() []byte { var file_gosdn_plugin_internal_plugin_internal_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_gosdn_plugin_internal_plugin_internal_proto_goTypes = []any{ (*GetAvailablePluginsRequest)(nil), // 0: gosdn.plugin_internal.GetAvailablePluginsRequest - (*GetAvailablePluginsResponse)(nil), // 1: gosdn.plugin_internal.GetAvailablePluginsResponse - (*GetPluginSchemaRequest)(nil), // 2: gosdn.plugin_internal.GetPluginSchemaRequest - (*PluginSchemaPayload)(nil), // 3: gosdn.plugin_internal.PluginSchemaPayload + (*GetPluginSchemaRequest)(nil), // 1: gosdn.plugin_internal.GetPluginSchemaRequest + (*PluginSchemaPayload)(nil), // 2: gosdn.plugin_internal.PluginSchemaPayload + (*GetAvailablePluginsResponse)(nil), // 3: gosdn.plugin_internal.GetAvailablePluginsResponse (*plugin_registry.Plugin)(nil), // 4: gosdn.plugin_registry.Plugin (*plugin_registry.GetResponse)(nil), // 5: gosdn.plugin_registry.GetResponse } var file_gosdn_plugin_internal_plugin_internal_proto_depIdxs = []int32{ 4, // 0: gosdn.plugin_internal.GetAvailablePluginsResponse.plugins:type_name -> gosdn.plugin_registry.Plugin 0, // 1: gosdn.plugin_internal.PluginInternalService.AvailablePlugins:input_type -> gosdn.plugin_internal.GetAvailablePluginsRequest - 2, // 2: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:input_type -> gosdn.plugin_internal.GetPluginSchemaRequest - 5, // 3: gosdn.plugin_internal.PluginInternalService.AvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse - 3, // 4: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:output_type -> gosdn.plugin_internal.PluginSchemaPayload - 3, // [3:5] is the sub-list for method output_type - 1, // [1:3] is the sub-list for method input_type + 1, // 2: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:input_type -> gosdn.plugin_internal.GetPluginSchemaRequest + 0, // 3: gosdn.plugin_internal.PluginInternalService.GetAvailablePlugins:input_type -> gosdn.plugin_internal.GetAvailablePluginsRequest + 5, // 4: gosdn.plugin_internal.PluginInternalService.AvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse + 2, // 5: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:output_type -> gosdn.plugin_internal.PluginSchemaPayload + 5, // 6: gosdn.plugin_internal.PluginInternalService.GetAvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse + 4, // [4:7] is the sub-list for method output_type + 1, // [1:4] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name @@ -314,7 +324,7 @@ func file_gosdn_plugin_internal_plugin_internal_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_plugin_internal_plugin_internal_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_plugin_internal_plugin_internal_proto_rawDesc), len(file_gosdn_plugin_internal_plugin_internal_proto_rawDesc)), NumEnums: 0, NumMessages: 4, NumExtensions: 0, @@ -325,7 +335,6 @@ func file_gosdn_plugin_internal_plugin_internal_proto_init() { MessageInfos: file_gosdn_plugin_internal_plugin_internal_proto_msgTypes, }.Build() File_gosdn_plugin_internal_plugin_internal_proto = out.File - file_gosdn_plugin_internal_plugin_internal_proto_rawDesc = nil file_gosdn_plugin_internal_plugin_internal_proto_goTypes = nil file_gosdn_plugin_internal_plugin_internal_proto_depIdxs = nil } diff --git a/api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go b/api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go new file mode 100644 index 000000000..9fd179fdf --- /dev/null +++ b/api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go @@ -0,0 +1,162 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: gosdn/plugin-internal/plugin-internal.proto + +/* +Package plugin_internal is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package plugin_internal + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_PluginInternalService_GetAvailablePlugins_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_PluginInternalService_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, client PluginInternalServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAvailablePluginsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginInternalService_GetAvailablePlugins_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetAvailablePlugins(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_PluginInternalService_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, server PluginInternalServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAvailablePluginsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginInternalService_GetAvailablePlugins_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetAvailablePlugins(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterPluginInternalServiceHandlerServer registers the http handlers for service PluginInternalService to "mux". +// UnaryRPC :call PluginInternalServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPluginInternalServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterPluginInternalServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PluginInternalServiceServer) error { + mux.Handle(http.MethodGet, pattern_PluginInternalService_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PluginInternalService_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_PluginInternalService_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterPluginInternalServiceHandlerFromEndpoint is same as RegisterPluginInternalServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterPluginInternalServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterPluginInternalServiceHandler(ctx, mux, conn) +} + +// RegisterPluginInternalServiceHandler registers the http handlers for service PluginInternalService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterPluginInternalServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterPluginInternalServiceHandlerClient(ctx, mux, NewPluginInternalServiceClient(conn)) +} + +// RegisterPluginInternalServiceHandlerClient registers the http handlers for service PluginInternalService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PluginInternalServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PluginInternalServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "PluginInternalServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterPluginInternalServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PluginInternalServiceClient) error { + mux.Handle(http.MethodGet, pattern_PluginInternalService_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PluginInternalService_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_PluginInternalService_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_PluginInternalService_GetAvailablePlugins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"plugins"}, "")) +) + +var ( + forward_PluginInternalService_GetAvailablePlugins_0 = runtime.ForwardResponseMessage +) diff --git a/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go b/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go index eaa452aa3..31b9539de 100755 --- a/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go +++ b/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go @@ -20,8 +20,9 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - PluginInternalService_AvailablePlugins_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins" - PluginInternalService_GetPluginSchema_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema" + PluginInternalService_AvailablePlugins_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins" + PluginInternalService_GetPluginSchema_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema" + PluginInternalService_GetAvailablePlugins_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins" ) // PluginInternalServiceClient is the client API for PluginInternalService service. @@ -30,6 +31,7 @@ const ( type PluginInternalServiceClient interface { AvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) GetPluginSchema(ctx context.Context, in *GetPluginSchemaRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[PluginSchemaPayload], error) + GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) } type pluginInternalServiceClient struct { @@ -69,12 +71,23 @@ func (c *pluginInternalServiceClient) GetPluginSchema(ctx context.Context, in *G // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type PluginInternalService_GetPluginSchemaClient = grpc.ServerStreamingClient[PluginSchemaPayload] +func (c *pluginInternalServiceClient) GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(plugin_registry.GetResponse) + err := c.cc.Invoke(ctx, PluginInternalService_GetAvailablePlugins_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // PluginInternalServiceServer is the server API for PluginInternalService service. // All implementations must embed UnimplementedPluginInternalServiceServer // for forward compatibility. type PluginInternalServiceServer interface { AvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) GetPluginSchema(*GetPluginSchemaRequest, grpc.ServerStreamingServer[PluginSchemaPayload]) error + GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) mustEmbedUnimplementedPluginInternalServiceServer() } @@ -91,6 +104,9 @@ func (UnimplementedPluginInternalServiceServer) AvailablePlugins(context.Context func (UnimplementedPluginInternalServiceServer) GetPluginSchema(*GetPluginSchemaRequest, grpc.ServerStreamingServer[PluginSchemaPayload]) error { return status.Errorf(codes.Unimplemented, "method GetPluginSchema not implemented") } +func (UnimplementedPluginInternalServiceServer) GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAvailablePlugins not implemented") +} func (UnimplementedPluginInternalServiceServer) mustEmbedUnimplementedPluginInternalServiceServer() {} func (UnimplementedPluginInternalServiceServer) testEmbeddedByValue() {} @@ -141,6 +157,24 @@ func _PluginInternalService_GetPluginSchema_Handler(srv interface{}, stream grpc // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type PluginInternalService_GetPluginSchemaServer = grpc.ServerStreamingServer[PluginSchemaPayload] +func _PluginInternalService_GetAvailablePlugins_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAvailablePluginsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PluginInternalServiceServer).GetAvailablePlugins(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: PluginInternalService_GetAvailablePlugins_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PluginInternalServiceServer).GetAvailablePlugins(ctx, req.(*GetAvailablePluginsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // PluginInternalService_ServiceDesc is the grpc.ServiceDesc for PluginInternalService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -152,6 +186,10 @@ var PluginInternalService_ServiceDesc = grpc.ServiceDesc{ MethodName: "AvailablePlugins", Handler: _PluginInternalService_AvailablePlugins_Handler, }, + { + MethodName: "GetAvailablePlugins", + Handler: _PluginInternalService_GetAvailablePlugins_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/api/go/gosdn/plugin-registry/plugin-registry.pb.go b/api/go/gosdn/plugin-registry/plugin-registry.pb.go index 7bb50e04f..ed6853721 100755 --- a/api/go/gosdn/plugin-registry/plugin-registry.pb.go +++ b/api/go/gosdn/plugin-registry/plugin-registry.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/plugin-registry/plugin-registry.proto @@ -8,11 +8,13 @@ package plugin_registry import ( _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" _ "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -23,12 +25,11 @@ const ( ) type GetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Query []*Query `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Query []*Query `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRequest) Reset() { @@ -76,11 +77,10 @@ func (x *GetRequest) GetQuery() []*Query { } type GetAllRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *GetAllRequest) Reset() { @@ -121,15 +121,14 @@ func (x *GetAllRequest) GetTimestamp() int64 { } type Query struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Identifier: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Identifier: // // *Query_Id // *Query_Name - Identifier isQuery_Identifier `protobuf_oneof:"identifier"` + Identifier isQuery_Identifier `protobuf_oneof:"identifier"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Query) Reset() { @@ -162,23 +161,27 @@ func (*Query) Descriptor() ([]byte, []int) { return file_gosdn_plugin_registry_plugin_registry_proto_rawDescGZIP(), []int{2} } -func (m *Query) GetIdentifier() isQuery_Identifier { - if m != nil { - return m.Identifier +func (x *Query) GetIdentifier() isQuery_Identifier { + if x != nil { + return x.Identifier } return nil } func (x *Query) GetId() string { - if x, ok := x.GetIdentifier().(*Query_Id); ok { - return x.Id + if x != nil { + if x, ok := x.Identifier.(*Query_Id); ok { + return x.Id + } } return "" } func (x *Query) GetName() string { - if x, ok := x.GetIdentifier().(*Query_Name); ok { - return x.Name + if x != nil { + if x, ok := x.Identifier.(*Query_Name); ok { + return x.Name + } } return "" } @@ -200,12 +203,11 @@ func (*Query_Id) isQuery_Identifier() {} func (*Query_Name) isQuery_Identifier() {} type GetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Plugins []*Plugin `protobuf:"bytes,2,rep,name=plugins,proto3" json:"plugins,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Plugins []*Plugin `protobuf:"bytes,2,rep,name=plugins,proto3" json:"plugins,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetResponse) Reset() { @@ -253,12 +255,11 @@ func (x *GetResponse) GetPlugins() []*Plugin { } type GetDownloadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetDownloadRequest) Reset() { @@ -306,11 +307,10 @@ func (x *GetDownloadRequest) GetId() string { } type GetDownloadPayload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` unknownFields protoimpl.UnknownFields - - Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetDownloadPayload) Reset() { @@ -351,12 +351,11 @@ func (x *GetDownloadPayload) GetChunk() []byte { } type DeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Id []string `protobuf:"bytes,2,rep,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Id []string `protobuf:"bytes,2,rep,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRequest) Reset() { @@ -404,11 +403,10 @@ func (x *DeleteRequest) GetId() []string { } type DeleteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *DeleteResponse) Reset() { @@ -449,12 +447,11 @@ func (x *DeleteResponse) GetTimestamp() int64 { } type Plugin struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Manifest *Manifest `protobuf:"bytes,2,opt,name=manifest,proto3" json:"manifest,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Manifest *Manifest `protobuf:"bytes,2,opt,name=manifest,proto3" json:"manifest,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Plugin) Reset() { @@ -502,14 +499,13 @@ func (x *Plugin) GetManifest() *Manifest { } type Manifest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Firmware string `protobuf:"bytes,2,opt,name=firmware,proto3" json:"firmware,omitempty"` + Author string `protobuf:"bytes,3,opt,name=author,proto3" json:"author,omitempty"` + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Firmware string `protobuf:"bytes,2,opt,name=firmware,proto3" json:"firmware,omitempty"` - Author string `protobuf:"bytes,3,opt,name=author,proto3" json:"author,omitempty"` - Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Manifest) Reset() { @@ -570,9 +566,105 @@ func (x *Manifest) GetVersion() string { return "" } +type GetAvailablePluginsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Plugins []*Plugin `protobuf:"bytes,2,rep,name=plugins,proto3" json:"plugins,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAvailablePluginsResponse) Reset() { + *x = GetAvailablePluginsResponse{} + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAvailablePluginsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAvailablePluginsResponse) ProtoMessage() {} + +func (x *GetAvailablePluginsResponse) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAvailablePluginsResponse.ProtoReflect.Descriptor instead. +func (*GetAvailablePluginsResponse) Descriptor() ([]byte, []int) { + return file_gosdn_plugin_registry_plugin_registry_proto_rawDescGZIP(), []int{10} +} + +func (x *GetAvailablePluginsResponse) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *GetAvailablePluginsResponse) GetPlugins() []*Plugin { + if x != nil { + return x.Plugins + } + return nil +} + +type GetAvailablePluginsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAvailablePluginsRequest) Reset() { + *x = GetAvailablePluginsRequest{} + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAvailablePluginsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAvailablePluginsRequest) ProtoMessage() {} + +func (x *GetAvailablePluginsRequest) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAvailablePluginsRequest.ProtoReflect.Descriptor instead. +func (*GetAvailablePluginsRequest) Descriptor() ([]byte, []int) { + return file_gosdn_plugin_registry_plugin_registry_proto_rawDescGZIP(), []int{11} +} + +func (x *GetAvailablePluginsRequest) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + var File_gosdn_plugin_registry_plugin_registry_proto protoreflect.FileDescriptor -var file_gosdn_plugin_registry_plugin_registry_proto_rawDesc = []byte{ +var file_gosdn_plugin_registry_plugin_registry_proto_rawDesc = string([]byte{ 0x0a, 0x2b, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x67, @@ -581,55 +673,68 @@ var file_gosdn_plugin_registry_plugin_registry_proto_rawDesc = []byte{ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3a, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2d, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4d, 0x0a, 0x05, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, - 0x01, 0x01, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x4a, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3a, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4d, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x4a, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2a, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, 0x06, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, + 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, + 0x73, 0x74, 0x22, 0x6c, 0x0a, 0x08, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x74, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, + 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2a, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, - 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, - 0x06, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, - 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x2e, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x22, 0x6c, 0x0a, 0x08, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x32, 0xf4, 0x02, 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x67, + 0x6d, 0x70, 0x32, 0xf4, 0x02, 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, @@ -657,50 +762,53 @@ var file_gosdn_plugin_registry_plugin_registry_proto_rawDesc = []byte{ 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_plugin_registry_plugin_registry_proto_rawDescOnce sync.Once - file_gosdn_plugin_registry_plugin_registry_proto_rawDescData = file_gosdn_plugin_registry_plugin_registry_proto_rawDesc + file_gosdn_plugin_registry_plugin_registry_proto_rawDescData []byte ) func file_gosdn_plugin_registry_plugin_registry_proto_rawDescGZIP() []byte { file_gosdn_plugin_registry_plugin_registry_proto_rawDescOnce.Do(func() { - file_gosdn_plugin_registry_plugin_registry_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_plugin_registry_plugin_registry_proto_rawDescData) + file_gosdn_plugin_registry_plugin_registry_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_plugin_registry_plugin_registry_proto_rawDesc), len(file_gosdn_plugin_registry_plugin_registry_proto_rawDesc))) }) return file_gosdn_plugin_registry_plugin_registry_proto_rawDescData } -var file_gosdn_plugin_registry_plugin_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_gosdn_plugin_registry_plugin_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_gosdn_plugin_registry_plugin_registry_proto_goTypes = []any{ - (*GetRequest)(nil), // 0: gosdn.plugin_registry.GetRequest - (*GetAllRequest)(nil), // 1: gosdn.plugin_registry.GetAllRequest - (*Query)(nil), // 2: gosdn.plugin_registry.Query - (*GetResponse)(nil), // 3: gosdn.plugin_registry.GetResponse - (*GetDownloadRequest)(nil), // 4: gosdn.plugin_registry.GetDownloadRequest - (*GetDownloadPayload)(nil), // 5: gosdn.plugin_registry.GetDownloadPayload - (*DeleteRequest)(nil), // 6: gosdn.plugin_registry.DeleteRequest - (*DeleteResponse)(nil), // 7: gosdn.plugin_registry.DeleteResponse - (*Plugin)(nil), // 8: gosdn.plugin_registry.Plugin - (*Manifest)(nil), // 9: gosdn.plugin_registry.Manifest + (*GetRequest)(nil), // 0: gosdn.plugin_registry.GetRequest + (*GetAllRequest)(nil), // 1: gosdn.plugin_registry.GetAllRequest + (*Query)(nil), // 2: gosdn.plugin_registry.Query + (*GetResponse)(nil), // 3: gosdn.plugin_registry.GetResponse + (*GetDownloadRequest)(nil), // 4: gosdn.plugin_registry.GetDownloadRequest + (*GetDownloadPayload)(nil), // 5: gosdn.plugin_registry.GetDownloadPayload + (*DeleteRequest)(nil), // 6: gosdn.plugin_registry.DeleteRequest + (*DeleteResponse)(nil), // 7: gosdn.plugin_registry.DeleteResponse + (*Plugin)(nil), // 8: gosdn.plugin_registry.Plugin + (*Manifest)(nil), // 9: gosdn.plugin_registry.Manifest + (*GetAvailablePluginsResponse)(nil), // 10: gosdn.plugin_registry.GetAvailablePluginsResponse + (*GetAvailablePluginsRequest)(nil), // 11: gosdn.plugin_registry.GetAvailablePluginsRequest } var file_gosdn_plugin_registry_plugin_registry_proto_depIdxs = []int32{ 2, // 0: gosdn.plugin_registry.GetRequest.query:type_name -> gosdn.plugin_registry.Query 8, // 1: gosdn.plugin_registry.GetResponse.plugins:type_name -> gosdn.plugin_registry.Plugin 9, // 2: gosdn.plugin_registry.Plugin.manifest:type_name -> gosdn.plugin_registry.Manifest - 0, // 3: gosdn.plugin_registry.PluginRegistryService.Get:input_type -> gosdn.plugin_registry.GetRequest - 1, // 4: gosdn.plugin_registry.PluginRegistryService.GetAll:input_type -> gosdn.plugin_registry.GetAllRequest - 4, // 5: gosdn.plugin_registry.PluginRegistryService.Download:input_type -> gosdn.plugin_registry.GetDownloadRequest - 6, // 6: gosdn.plugin_registry.PluginRegistryService.Delete:input_type -> gosdn.plugin_registry.DeleteRequest - 3, // 7: gosdn.plugin_registry.PluginRegistryService.Get:output_type -> gosdn.plugin_registry.GetResponse - 3, // 8: gosdn.plugin_registry.PluginRegistryService.GetAll:output_type -> gosdn.plugin_registry.GetResponse - 5, // 9: gosdn.plugin_registry.PluginRegistryService.Download:output_type -> gosdn.plugin_registry.GetDownloadPayload - 7, // 10: gosdn.plugin_registry.PluginRegistryService.Delete:output_type -> gosdn.plugin_registry.DeleteResponse - 7, // [7:11] is the sub-list for method output_type - 3, // [3:7] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 8, // 3: gosdn.plugin_registry.GetAvailablePluginsResponse.plugins:type_name -> gosdn.plugin_registry.Plugin + 0, // 4: gosdn.plugin_registry.PluginRegistryService.Get:input_type -> gosdn.plugin_registry.GetRequest + 1, // 5: gosdn.plugin_registry.PluginRegistryService.GetAll:input_type -> gosdn.plugin_registry.GetAllRequest + 4, // 6: gosdn.plugin_registry.PluginRegistryService.Download:input_type -> gosdn.plugin_registry.GetDownloadRequest + 6, // 7: gosdn.plugin_registry.PluginRegistryService.Delete:input_type -> gosdn.plugin_registry.DeleteRequest + 3, // 8: gosdn.plugin_registry.PluginRegistryService.Get:output_type -> gosdn.plugin_registry.GetResponse + 3, // 9: gosdn.plugin_registry.PluginRegistryService.GetAll:output_type -> gosdn.plugin_registry.GetResponse + 5, // 10: gosdn.plugin_registry.PluginRegistryService.Download:output_type -> gosdn.plugin_registry.GetDownloadPayload + 7, // 11: gosdn.plugin_registry.PluginRegistryService.Delete:output_type -> gosdn.plugin_registry.DeleteResponse + 8, // [8:12] is the sub-list for method output_type + 4, // [4:8] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_gosdn_plugin_registry_plugin_registry_proto_init() } @@ -716,9 +824,9 @@ func file_gosdn_plugin_registry_plugin_registry_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_plugin_registry_plugin_registry_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_plugin_registry_plugin_registry_proto_rawDesc), len(file_gosdn_plugin_registry_plugin_registry_proto_rawDesc)), NumEnums: 0, - NumMessages: 10, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, @@ -727,7 +835,6 @@ func file_gosdn_plugin_registry_plugin_registry_proto_init() { MessageInfos: file_gosdn_plugin_registry_plugin_registry_proto_msgTypes, }.Build() File_gosdn_plugin_registry_plugin_registry_proto = out.File - file_gosdn_plugin_registry_plugin_registry_proto_rawDesc = nil file_gosdn_plugin_registry_plugin_registry_proto_goTypes = nil file_gosdn_plugin_registry_plugin_registry_proto_depIdxs = nil } diff --git a/api/go/gosdn/plugin-registry/plugin-registry.pb.gw.go b/api/go/gosdn/plugin-registry/plugin-registry.pb.gw.go new file mode 100644 index 000000000..bd500348f --- /dev/null +++ b/api/go/gosdn/plugin-registry/plugin-registry.pb.gw.go @@ -0,0 +1,162 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: gosdn/plugin-registry/plugin-registry.proto + +/* +Package plugin_registry is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package plugin_registry + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_PluginRegistryService_GetAll_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_PluginRegistryService_GetAll_0(ctx context.Context, marshaler runtime.Marshaler, client PluginRegistryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAllRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginRegistryService_GetAll_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetAll(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_PluginRegistryService_GetAll_0(ctx context.Context, marshaler runtime.Marshaler, server PluginRegistryServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAllRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginRegistryService_GetAll_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetAll(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterPluginRegistryServiceHandlerServer registers the http handlers for service PluginRegistryService to "mux". +// UnaryRPC :call PluginRegistryServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPluginRegistryServiceHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterPluginRegistryServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PluginRegistryServiceServer) error { + mux.Handle(http.MethodGet, pattern_PluginRegistryService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.plugin_registry.PluginRegistryService/GetAll", runtime.WithHTTPPathPattern("/plugins/here")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_PluginRegistryService_GetAll_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_PluginRegistryService_GetAll_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterPluginRegistryServiceHandlerFromEndpoint is same as RegisterPluginRegistryServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterPluginRegistryServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterPluginRegistryServiceHandler(ctx, mux, conn) +} + +// RegisterPluginRegistryServiceHandler registers the http handlers for service PluginRegistryService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterPluginRegistryServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterPluginRegistryServiceHandlerClient(ctx, mux, NewPluginRegistryServiceClient(conn)) +} + +// RegisterPluginRegistryServiceHandlerClient registers the http handlers for service PluginRegistryService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PluginRegistryServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PluginRegistryServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "PluginRegistryServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterPluginRegistryServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PluginRegistryServiceClient) error { + mux.Handle(http.MethodGet, pattern_PluginRegistryService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.plugin_registry.PluginRegistryService/GetAll", runtime.WithHTTPPathPattern("/plugins/here")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_PluginRegistryService_GetAll_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_PluginRegistryService_GetAll_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_PluginRegistryService_GetAll_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"plugins", "here"}, "")) +) + +var ( + forward_PluginRegistryService_GetAll_0 = runtime.ForwardResponseMessage +) diff --git a/api/go/gosdn/plugin/plugin.pb.go b/api/go/gosdn/plugin/plugin.pb.go index 9193b62ac..273425267 100755 --- a/api/go/gosdn/plugin/plugin.pb.go +++ b/api/go/gosdn/plugin/plugin.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/plugin/plugin.proto @@ -9,11 +9,14 @@ package plugin import ( _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" networkelement "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" + plugin_registry "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry" gnmi "github.com/openconfig/gnmi/proto/gnmi" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -24,13 +27,12 @@ const ( ) type UnmarshalRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Json []byte `protobuf:"bytes,1,opt,name=json,proto3" json:"json,omitempty"` + Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields - - Json []byte `protobuf:"bytes,1,opt,name=json,proto3" json:"json,omitempty"` - Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UnmarshalRequest) Reset() { @@ -85,11 +87,10 @@ func (x *UnmarshalRequest) GetValue() *gnmi.TypedValue { } type UnmarshalResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` unknownFields protoimpl.UnknownFields - - Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UnmarshalResponse) Reset() { @@ -130,12 +131,11 @@ func (x *UnmarshalResponse) GetValid() bool { } type SetNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields - - Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetNodeRequest) Reset() { @@ -183,11 +183,10 @@ func (x *SetNodeRequest) GetValue() *gnmi.TypedValue { } type SetNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` unknownFields protoimpl.UnknownFields - - Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SetNodeResponse) Reset() { @@ -228,12 +227,11 @@ func (x *SetNodeResponse) GetValid() bool { } type GetNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - RequestForIntendedState bool `protobuf:"varint,3,opt,name=requestForIntendedState,proto3" json:"requestForIntendedState,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + RequestForIntendedState bool `protobuf:"varint,3,opt,name=requestForIntendedState,proto3" json:"requestForIntendedState,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetNodeRequest) Reset() { @@ -281,11 +279,10 @@ func (x *GetNodeRequest) GetRequestForIntendedState() bool { } type GetNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Nodes []*gnmi.Notification `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` unknownFields protoimpl.UnknownFields - - Nodes []*gnmi.Notification `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetNodeResponse) Reset() { @@ -326,11 +323,10 @@ func (x *GetNodeResponse) GetNodes() []*gnmi.Notification { } type DeleteNodeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` unknownFields protoimpl.UnknownFields - - Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteNodeRequest) Reset() { @@ -371,11 +367,10 @@ func (x *DeleteNodeRequest) GetPath() *gnmi.Path { } type DeleteNodeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` unknownFields protoimpl.UnknownFields - - Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteNodeResponse) Reset() { @@ -416,11 +411,10 @@ func (x *DeleteNodeResponse) GetValid() bool { } type ModelRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FilterReadOnly bool `protobuf:"varint,1,opt,name=filterReadOnly,proto3" json:"filterReadOnly,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + FilterReadOnly bool `protobuf:"varint,1,opt,name=filterReadOnly,proto3" json:"filterReadOnly,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ModelRequest) Reset() { @@ -461,11 +455,10 @@ func (x *ModelRequest) GetFilterReadOnly() bool { } type ModelResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Json []byte `protobuf:"bytes,1,opt,name=json,proto3" json:"json,omitempty"` // JSON-encoded text per RFC7951. unknownFields protoimpl.UnknownFields - - Json []byte `protobuf:"bytes,1,opt,name=json,proto3" json:"json,omitempty"` // JSON-encoded text per RFC7951. + sizeCache protoimpl.SizeCache } func (x *ModelResponse) Reset() { @@ -506,12 +499,11 @@ func (x *ModelResponse) GetJson() []byte { } type DiffRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Original []byte `protobuf:"bytes,1,opt,name=original,proto3" json:"original,omitempty"` // JSON-encoded text per RFC7951. + Modified []byte `protobuf:"bytes,2,opt,name=modified,proto3" json:"modified,omitempty"` // JSON-encoded text per RFC7951. unknownFields protoimpl.UnknownFields - - Original []byte `protobuf:"bytes,1,opt,name=original,proto3" json:"original,omitempty"` // JSON-encoded text per RFC7951. - Modified []byte `protobuf:"bytes,2,opt,name=modified,proto3" json:"modified,omitempty"` // JSON-encoded text per RFC7951. + sizeCache protoimpl.SizeCache } func (x *DiffRequest) Reset() { @@ -559,11 +551,10 @@ func (x *DiffRequest) GetModified() []byte { } type DiffResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Notification *gnmi.Notification `protobuf:"bytes,1,opt,name=notification,proto3" json:"notification,omitempty"` unknownFields protoimpl.UnknownFields - - Notification *gnmi.Notification `protobuf:"bytes,1,opt,name=notification,proto3" json:"notification,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DiffResponse) Reset() { @@ -604,13 +595,12 @@ func (x *DiffResponse) GetNotification() *gnmi.Notification { } type ValidateChangeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Operation networkelement.ApiOperation `protobuf:"varint,1,opt,name=operation,proto3,enum=gosdn.networkelement.ApiOperation" json:"operation,omitempty"` + Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields - - Operation networkelement.ApiOperation `protobuf:"varint,1,opt,name=operation,proto3,enum=gosdn.networkelement.ApiOperation" json:"operation,omitempty"` - Path *gnmi.Path `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Value *gnmi.TypedValue `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ValidateChangeRequest) Reset() { @@ -665,11 +655,10 @@ func (x *ValidateChangeRequest) GetValue() *gnmi.TypedValue { } type ValidateChangeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Model []byte `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` // JSON-encoded text per RFC7951. unknownFields protoimpl.UnknownFields - - Model []byte `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` // JSON-encoded text per RFC7951. + sizeCache protoimpl.SizeCache } func (x *ValidateChangeResponse) Reset() { @@ -710,11 +699,10 @@ func (x *ValidateChangeResponse) GetModel() []byte { } type PruneConfigFalseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // JSON-encoded text per RFC7951. unknownFields protoimpl.UnknownFields - - Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // JSON-encoded text per RFC7951. + sizeCache protoimpl.SizeCache } func (x *PruneConfigFalseRequest) Reset() { @@ -755,11 +743,10 @@ func (x *PruneConfigFalseRequest) GetValue() []byte { } type PruneConfigFalseResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Model []byte `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` // JSON-encoded text per RFC7951. unknownFields protoimpl.UnknownFields - - Model []byte `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"` // JSON-encoded text per RFC7951. + sizeCache protoimpl.SizeCache } func (x *PruneConfigFalseResponse) Reset() { @@ -800,9 +787,9 @@ func (x *PruneConfigFalseResponse) GetModel() []byte { } type SchemaTreeGzipRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SchemaTreeGzipRequest) Reset() { @@ -836,11 +823,10 @@ func (*SchemaTreeGzipRequest) Descriptor() ([]byte, []int) { } type Payload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` unknownFields protoimpl.UnknownFields - - Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Payload) Reset() { @@ -880,9 +866,53 @@ func (x *Payload) GetChunk() []byte { return nil } +type GetAvailablePluginsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAvailablePluginsRequest) Reset() { + *x = GetAvailablePluginsRequest{} + mi := &file_gosdn_plugin_plugin_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAvailablePluginsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAvailablePluginsRequest) ProtoMessage() {} + +func (x *GetAvailablePluginsRequest) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_plugin_plugin_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAvailablePluginsRequest.ProtoReflect.Descriptor instead. +func (*GetAvailablePluginsRequest) Descriptor() ([]byte, []int) { + return file_gosdn_plugin_plugin_proto_rawDescGZIP(), []int{18} +} + +func (x *GetAvailablePluginsRequest) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + var File_gosdn_plugin_plugin_proto protoreflect.FileDescriptor -var file_gosdn_plugin_plugin_proto_rawDesc = []byte{ +var file_gosdn_plugin_plugin_proto_rawDesc = string([]byte{ 0x0a, 0x19, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x1a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, @@ -890,188 +920,205 @@ var file_gosdn_plugin_plugin_proto_rawDesc = []byte{ 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x7e, 0x0a, 0x10, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x2b, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7e, + 0x0a, 0x10, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, + 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x29, + 0x0a, 0x11, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x68, 0x0a, 0x0e, 0x53, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x29, 0x0a, 0x11, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x6c, 0x75, 0x65, 0x22, 0x27, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x7a, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, + 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x40, 0x0a, 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, + 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, + 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, + 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x68, - 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, - 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x27, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x22, 0x7a, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, - 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x40, 0x0a, 0x17, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, - 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3b, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x28, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x11, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, - 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x0c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, - 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, - 0x6e, 0x6c, 0x79, 0x22, 0x23, 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x44, 0x69, 0x66, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, - 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, - 0x46, 0x0a, 0x0c, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x36, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x01, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x48, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x69, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, - 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x2e, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, - 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x30, 0x0a, 0x18, - 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, + 0x0a, 0x0c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, + 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x23, + 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x08, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0x46, 0x0a, 0x0c, 0x44, 0x69, + 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xb9, 0x01, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x09, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x09, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, + 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2e, + 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x17, - 0x0a, 0x15, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1f, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x32, 0xc8, 0x05, 0x0a, 0x06, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x12, 0x4c, 0x0a, 0x09, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, - 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, - 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, - 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x40, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x44, 0x69, 0x66, 0x66, 0x12, 0x19, 0x2e, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, - 0x65, 0x47, 0x7a, 0x69, 0x70, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, - 0x7a, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x61, 0x0a, 0x10, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, - 0x61, 0x6c, 0x73, 0x65, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, - 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x37, + 0x0a, 0x17, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x30, 0x0a, 0x18, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x42, 0x32, 0x5a, 0x30, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, - 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, - 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x1f, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, + 0xad, 0x06, 0x0a, 0x06, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x4c, 0x0a, 0x09, 0x55, 0x6e, + 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x46, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, + 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x05, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x44, + 0x69, 0x66, 0x66, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, + 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x12, 0x23, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x50, 0x72, 0x75, 0x6e, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x25, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x32, 0x5a, 0x30, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, + 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +}) var ( file_gosdn_plugin_plugin_proto_rawDescOnce sync.Once - file_gosdn_plugin_plugin_proto_rawDescData = file_gosdn_plugin_plugin_proto_rawDesc + file_gosdn_plugin_plugin_proto_rawDescData []byte ) func file_gosdn_plugin_plugin_proto_rawDescGZIP() []byte { file_gosdn_plugin_plugin_proto_rawDescOnce.Do(func() { - file_gosdn_plugin_plugin_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_plugin_plugin_proto_rawDescData) + file_gosdn_plugin_plugin_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_plugin_plugin_proto_rawDesc), len(file_gosdn_plugin_plugin_proto_rawDesc))) }) return file_gosdn_plugin_plugin_proto_rawDescData } -var file_gosdn_plugin_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_gosdn_plugin_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_gosdn_plugin_plugin_proto_goTypes = []any{ - (*UnmarshalRequest)(nil), // 0: gosdn.plugin.UnmarshalRequest - (*UnmarshalResponse)(nil), // 1: gosdn.plugin.UnmarshalResponse - (*SetNodeRequest)(nil), // 2: gosdn.plugin.SetNodeRequest - (*SetNodeResponse)(nil), // 3: gosdn.plugin.SetNodeResponse - (*GetNodeRequest)(nil), // 4: gosdn.plugin.GetNodeRequest - (*GetNodeResponse)(nil), // 5: gosdn.plugin.GetNodeResponse - (*DeleteNodeRequest)(nil), // 6: gosdn.plugin.DeleteNodeRequest - (*DeleteNodeResponse)(nil), // 7: gosdn.plugin.DeleteNodeResponse - (*ModelRequest)(nil), // 8: gosdn.plugin.ModelRequest - (*ModelResponse)(nil), // 9: gosdn.plugin.ModelResponse - (*DiffRequest)(nil), // 10: gosdn.plugin.DiffRequest - (*DiffResponse)(nil), // 11: gosdn.plugin.DiffResponse - (*ValidateChangeRequest)(nil), // 12: gosdn.plugin.ValidateChangeRequest - (*ValidateChangeResponse)(nil), // 13: gosdn.plugin.ValidateChangeResponse - (*PruneConfigFalseRequest)(nil), // 14: gosdn.plugin.PruneConfigFalseRequest - (*PruneConfigFalseResponse)(nil), // 15: gosdn.plugin.PruneConfigFalseResponse - (*SchemaTreeGzipRequest)(nil), // 16: gosdn.plugin.SchemaTreeGzipRequest - (*Payload)(nil), // 17: gosdn.plugin.Payload - (*gnmi.Path)(nil), // 18: gnmi.Path - (*gnmi.TypedValue)(nil), // 19: gnmi.TypedValue - (*gnmi.Notification)(nil), // 20: gnmi.Notification - (networkelement.ApiOperation)(0), // 21: gosdn.networkelement.ApiOperation + (*UnmarshalRequest)(nil), // 0: gosdn.plugin.UnmarshalRequest + (*UnmarshalResponse)(nil), // 1: gosdn.plugin.UnmarshalResponse + (*SetNodeRequest)(nil), // 2: gosdn.plugin.SetNodeRequest + (*SetNodeResponse)(nil), // 3: gosdn.plugin.SetNodeResponse + (*GetNodeRequest)(nil), // 4: gosdn.plugin.GetNodeRequest + (*GetNodeResponse)(nil), // 5: gosdn.plugin.GetNodeResponse + (*DeleteNodeRequest)(nil), // 6: gosdn.plugin.DeleteNodeRequest + (*DeleteNodeResponse)(nil), // 7: gosdn.plugin.DeleteNodeResponse + (*ModelRequest)(nil), // 8: gosdn.plugin.ModelRequest + (*ModelResponse)(nil), // 9: gosdn.plugin.ModelResponse + (*DiffRequest)(nil), // 10: gosdn.plugin.DiffRequest + (*DiffResponse)(nil), // 11: gosdn.plugin.DiffResponse + (*ValidateChangeRequest)(nil), // 12: gosdn.plugin.ValidateChangeRequest + (*ValidateChangeResponse)(nil), // 13: gosdn.plugin.ValidateChangeResponse + (*PruneConfigFalseRequest)(nil), // 14: gosdn.plugin.PruneConfigFalseRequest + (*PruneConfigFalseResponse)(nil), // 15: gosdn.plugin.PruneConfigFalseResponse + (*SchemaTreeGzipRequest)(nil), // 16: gosdn.plugin.SchemaTreeGzipRequest + (*Payload)(nil), // 17: gosdn.plugin.Payload + (*GetAvailablePluginsRequest)(nil), // 18: gosdn.plugin.GetAvailablePluginsRequest + (*gnmi.Path)(nil), // 19: gnmi.Path + (*gnmi.TypedValue)(nil), // 20: gnmi.TypedValue + (*gnmi.Notification)(nil), // 21: gnmi.Notification + (networkelement.ApiOperation)(0), // 22: gosdn.networkelement.ApiOperation + (*plugin_registry.GetResponse)(nil), // 23: gosdn.plugin_registry.GetResponse } var file_gosdn_plugin_plugin_proto_depIdxs = []int32{ - 18, // 0: gosdn.plugin.UnmarshalRequest.path:type_name -> gnmi.Path - 19, // 1: gosdn.plugin.UnmarshalRequest.value:type_name -> gnmi.TypedValue - 18, // 2: gosdn.plugin.SetNodeRequest.path:type_name -> gnmi.Path - 19, // 3: gosdn.plugin.SetNodeRequest.value:type_name -> gnmi.TypedValue - 18, // 4: gosdn.plugin.GetNodeRequest.path:type_name -> gnmi.Path - 20, // 5: gosdn.plugin.GetNodeResponse.nodes:type_name -> gnmi.Notification - 18, // 6: gosdn.plugin.DeleteNodeRequest.path:type_name -> gnmi.Path - 20, // 7: gosdn.plugin.DiffResponse.notification:type_name -> gnmi.Notification - 21, // 8: gosdn.plugin.ValidateChangeRequest.operation:type_name -> gosdn.networkelement.ApiOperation - 18, // 9: gosdn.plugin.ValidateChangeRequest.path:type_name -> gnmi.Path - 19, // 10: gosdn.plugin.ValidateChangeRequest.value:type_name -> gnmi.TypedValue + 19, // 0: gosdn.plugin.UnmarshalRequest.path:type_name -> gnmi.Path + 20, // 1: gosdn.plugin.UnmarshalRequest.value:type_name -> gnmi.TypedValue + 19, // 2: gosdn.plugin.SetNodeRequest.path:type_name -> gnmi.Path + 20, // 3: gosdn.plugin.SetNodeRequest.value:type_name -> gnmi.TypedValue + 19, // 4: gosdn.plugin.GetNodeRequest.path:type_name -> gnmi.Path + 21, // 5: gosdn.plugin.GetNodeResponse.nodes:type_name -> gnmi.Notification + 19, // 6: gosdn.plugin.DeleteNodeRequest.path:type_name -> gnmi.Path + 21, // 7: gosdn.plugin.DiffResponse.notification:type_name -> gnmi.Notification + 22, // 8: gosdn.plugin.ValidateChangeRequest.operation:type_name -> gosdn.networkelement.ApiOperation + 19, // 9: gosdn.plugin.ValidateChangeRequest.path:type_name -> gnmi.Path + 20, // 10: gosdn.plugin.ValidateChangeRequest.value:type_name -> gnmi.TypedValue 0, // 11: gosdn.plugin.Plugin.Unmarshal:input_type -> gosdn.plugin.UnmarshalRequest 2, // 12: gosdn.plugin.Plugin.SetNode:input_type -> gosdn.plugin.SetNodeRequest 4, // 13: gosdn.plugin.Plugin.GetNode:input_type -> gosdn.plugin.GetNodeRequest @@ -1081,17 +1128,19 @@ var file_gosdn_plugin_plugin_proto_depIdxs = []int32{ 16, // 17: gosdn.plugin.Plugin.SchemaTreeGzip:input_type -> gosdn.plugin.SchemaTreeGzipRequest 12, // 18: gosdn.plugin.Plugin.ValidateChange:input_type -> gosdn.plugin.ValidateChangeRequest 14, // 19: gosdn.plugin.Plugin.PruneConfigFalse:input_type -> gosdn.plugin.PruneConfigFalseRequest - 1, // 20: gosdn.plugin.Plugin.Unmarshal:output_type -> gosdn.plugin.UnmarshalResponse - 3, // 21: gosdn.plugin.Plugin.SetNode:output_type -> gosdn.plugin.SetNodeResponse - 5, // 22: gosdn.plugin.Plugin.GetNode:output_type -> gosdn.plugin.GetNodeResponse - 7, // 23: gosdn.plugin.Plugin.DeleteNode:output_type -> gosdn.plugin.DeleteNodeResponse - 9, // 24: gosdn.plugin.Plugin.Model:output_type -> gosdn.plugin.ModelResponse - 11, // 25: gosdn.plugin.Plugin.Diff:output_type -> gosdn.plugin.DiffResponse - 17, // 26: gosdn.plugin.Plugin.SchemaTreeGzip:output_type -> gosdn.plugin.Payload - 13, // 27: gosdn.plugin.Plugin.ValidateChange:output_type -> gosdn.plugin.ValidateChangeResponse - 15, // 28: gosdn.plugin.Plugin.PruneConfigFalse:output_type -> gosdn.plugin.PruneConfigFalseResponse - 20, // [20:29] is the sub-list for method output_type - 11, // [11:20] is the sub-list for method input_type + 18, // 20: gosdn.plugin.Plugin.GetAvailablePlugins:input_type -> gosdn.plugin.GetAvailablePluginsRequest + 1, // 21: gosdn.plugin.Plugin.Unmarshal:output_type -> gosdn.plugin.UnmarshalResponse + 3, // 22: gosdn.plugin.Plugin.SetNode:output_type -> gosdn.plugin.SetNodeResponse + 5, // 23: gosdn.plugin.Plugin.GetNode:output_type -> gosdn.plugin.GetNodeResponse + 7, // 24: gosdn.plugin.Plugin.DeleteNode:output_type -> gosdn.plugin.DeleteNodeResponse + 9, // 25: gosdn.plugin.Plugin.Model:output_type -> gosdn.plugin.ModelResponse + 11, // 26: gosdn.plugin.Plugin.Diff:output_type -> gosdn.plugin.DiffResponse + 17, // 27: gosdn.plugin.Plugin.SchemaTreeGzip:output_type -> gosdn.plugin.Payload + 13, // 28: gosdn.plugin.Plugin.ValidateChange:output_type -> gosdn.plugin.ValidateChangeResponse + 15, // 29: gosdn.plugin.Plugin.PruneConfigFalse:output_type -> gosdn.plugin.PruneConfigFalseResponse + 23, // 30: gosdn.plugin.Plugin.GetAvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse + 21, // [21:31] is the sub-list for method output_type + 11, // [11:21] is the sub-list for method input_type 11, // [11:11] is the sub-list for extension type_name 11, // [11:11] is the sub-list for extension extendee 0, // [0:11] is the sub-list for field type_name @@ -1106,9 +1155,9 @@ func file_gosdn_plugin_plugin_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_plugin_plugin_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_plugin_plugin_proto_rawDesc), len(file_gosdn_plugin_plugin_proto_rawDesc)), NumEnums: 0, - NumMessages: 18, + NumMessages: 19, NumExtensions: 0, NumServices: 1, }, @@ -1117,7 +1166,6 @@ func file_gosdn_plugin_plugin_proto_init() { MessageInfos: file_gosdn_plugin_plugin_proto_msgTypes, }.Build() File_gosdn_plugin_plugin_proto = out.File - file_gosdn_plugin_plugin_proto_rawDesc = nil file_gosdn_plugin_plugin_proto_goTypes = nil file_gosdn_plugin_plugin_proto_depIdxs = nil } diff --git a/api/go/gosdn/plugin/plugin.pb.gw.go b/api/go/gosdn/plugin/plugin.pb.gw.go new file mode 100644 index 000000000..745f6cadd --- /dev/null +++ b/api/go/gosdn/plugin/plugin.pb.gw.go @@ -0,0 +1,162 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: gosdn/plugin/plugin.proto + +/* +Package plugin is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package plugin + +import ( + "context" + "errors" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) + +var filter_Plugin_GetAvailablePlugins_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_Plugin_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, client PluginClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAvailablePluginsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Plugin_GetAvailablePlugins_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.GetAvailablePlugins(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Plugin_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, server PluginServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAvailablePluginsRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Plugin_GetAvailablePlugins_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.GetAvailablePlugins(ctx, &protoReq) + return msg, metadata, err +} + +// RegisterPluginHandlerServer registers the http handlers for service Plugin to "mux". +// UnaryRPC :call PluginServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPluginHandlerFromEndpoint instead. +// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. +func RegisterPluginHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PluginServer) error { + mux.Handle(http.MethodGet, pattern_Plugin_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.plugin.Plugin/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins/plugin")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Plugin_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Plugin_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + + return nil +} + +// RegisterPluginHandlerFromEndpoint is same as RegisterPluginHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterPluginHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.NewClient(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + return RegisterPluginHandler(ctx, mux, conn) +} + +// RegisterPluginHandler registers the http handlers for service Plugin to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterPluginHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterPluginHandlerClient(ctx, mux, NewPluginClient(conn)) +} + +// RegisterPluginHandlerClient registers the http handlers for service Plugin +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PluginClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PluginClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "PluginClient" to call the correct interceptors. This client ignores the HTTP middlewares. +func RegisterPluginHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PluginClient) error { + mux.Handle(http.MethodGet, pattern_Plugin_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.plugin.Plugin/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins/plugin")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Plugin_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Plugin_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil +} + +var ( + pattern_Plugin_GetAvailablePlugins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"plugins", "plugin"}, "")) +) + +var ( + forward_Plugin_GetAvailablePlugins_0 = runtime.ForwardResponseMessage +) diff --git a/api/go/gosdn/plugin/plugin_grpc.pb.go b/api/go/gosdn/plugin/plugin_grpc.pb.go index e524b8c4b..ec194d82d 100755 --- a/api/go/gosdn/plugin/plugin_grpc.pb.go +++ b/api/go/gosdn/plugin/plugin_grpc.pb.go @@ -7,6 +7,7 @@ package plugin import ( + plugin_registry "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry" context "context" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -19,15 +20,16 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Plugin_Unmarshal_FullMethodName = "/gosdn.plugin.Plugin/Unmarshal" - Plugin_SetNode_FullMethodName = "/gosdn.plugin.Plugin/SetNode" - Plugin_GetNode_FullMethodName = "/gosdn.plugin.Plugin/GetNode" - Plugin_DeleteNode_FullMethodName = "/gosdn.plugin.Plugin/DeleteNode" - Plugin_Model_FullMethodName = "/gosdn.plugin.Plugin/Model" - Plugin_Diff_FullMethodName = "/gosdn.plugin.Plugin/Diff" - Plugin_SchemaTreeGzip_FullMethodName = "/gosdn.plugin.Plugin/SchemaTreeGzip" - Plugin_ValidateChange_FullMethodName = "/gosdn.plugin.Plugin/ValidateChange" - Plugin_PruneConfigFalse_FullMethodName = "/gosdn.plugin.Plugin/PruneConfigFalse" + Plugin_Unmarshal_FullMethodName = "/gosdn.plugin.Plugin/Unmarshal" + Plugin_SetNode_FullMethodName = "/gosdn.plugin.Plugin/SetNode" + Plugin_GetNode_FullMethodName = "/gosdn.plugin.Plugin/GetNode" + Plugin_DeleteNode_FullMethodName = "/gosdn.plugin.Plugin/DeleteNode" + Plugin_Model_FullMethodName = "/gosdn.plugin.Plugin/Model" + Plugin_Diff_FullMethodName = "/gosdn.plugin.Plugin/Diff" + Plugin_SchemaTreeGzip_FullMethodName = "/gosdn.plugin.Plugin/SchemaTreeGzip" + Plugin_ValidateChange_FullMethodName = "/gosdn.plugin.Plugin/ValidateChange" + Plugin_PruneConfigFalse_FullMethodName = "/gosdn.plugin.Plugin/PruneConfigFalse" + Plugin_GetAvailablePlugins_FullMethodName = "/gosdn.plugin.Plugin/GetAvailablePlugins" ) // PluginClient is the client API for Plugin service. @@ -43,6 +45,7 @@ type PluginClient interface { SchemaTreeGzip(ctx context.Context, in *SchemaTreeGzipRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[Payload], error) ValidateChange(ctx context.Context, in *ValidateChangeRequest, opts ...grpc.CallOption) (*ValidateChangeResponse, error) PruneConfigFalse(ctx context.Context, in *PruneConfigFalseRequest, opts ...grpc.CallOption) (*PruneConfigFalseResponse, error) + GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) } type pluginClient struct { @@ -152,6 +155,16 @@ func (c *pluginClient) PruneConfigFalse(ctx context.Context, in *PruneConfigFals return out, nil } +func (c *pluginClient) GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(plugin_registry.GetResponse) + err := c.cc.Invoke(ctx, Plugin_GetAvailablePlugins_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // PluginServer is the server API for Plugin service. // All implementations must embed UnimplementedPluginServer // for forward compatibility. @@ -165,6 +178,7 @@ type PluginServer interface { SchemaTreeGzip(*SchemaTreeGzipRequest, grpc.ServerStreamingServer[Payload]) error ValidateChange(context.Context, *ValidateChangeRequest) (*ValidateChangeResponse, error) PruneConfigFalse(context.Context, *PruneConfigFalseRequest) (*PruneConfigFalseResponse, error) + GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) mustEmbedUnimplementedPluginServer() } @@ -202,6 +216,9 @@ func (UnimplementedPluginServer) ValidateChange(context.Context, *ValidateChange func (UnimplementedPluginServer) PruneConfigFalse(context.Context, *PruneConfigFalseRequest) (*PruneConfigFalseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PruneConfigFalse not implemented") } +func (UnimplementedPluginServer) GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAvailablePlugins not implemented") +} func (UnimplementedPluginServer) mustEmbedUnimplementedPluginServer() {} func (UnimplementedPluginServer) testEmbeddedByValue() {} @@ -378,6 +395,24 @@ func _Plugin_PruneConfigFalse_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Plugin_GetAvailablePlugins_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAvailablePluginsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PluginServer).GetAvailablePlugins(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Plugin_GetAvailablePlugins_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PluginServer).GetAvailablePlugins(ctx, req.(*GetAvailablePluginsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Plugin_ServiceDesc is the grpc.ServiceDesc for Plugin service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -417,6 +452,10 @@ var Plugin_ServiceDesc = grpc.ServiceDesc{ MethodName: "PruneConfigFalse", Handler: _Plugin_PruneConfigFalse_Handler, }, + { + MethodName: "GetAvailablePlugins", + Handler: _Plugin_GetAvailablePlugins_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/api/go/gosdn/pnd/pnd.pb.go b/api/go/gosdn/pnd/pnd.pb.go index 16f5b733d..71b33fdd0 100755 --- a/api/go/gosdn/pnd/pnd.pb.go +++ b/api/go/gosdn/pnd/pnd.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/pnd/pnd.proto @@ -17,6 +17,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -27,13 +28,12 @@ const ( ) type PrincipalNetworkDomain struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PrincipalNetworkDomain) Reset() { @@ -88,12 +88,11 @@ func (x *PrincipalNetworkDomain) GetDescription() string { } type GetPndRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetPndRequest) Reset() { @@ -141,12 +140,11 @@ func (x *GetPndRequest) GetPid() string { } type GetPndResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetPndResponse) Reset() { @@ -194,11 +192,10 @@ func (x *GetPndResponse) GetPnd() *PrincipalNetworkDomain { } type GetPndListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *GetPndListRequest) Reset() { @@ -239,12 +236,11 @@ func (x *GetPndListRequest) GetTimestamp() int64 { } type GetPndListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pnd []*PrincipalNetworkDomain `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pnd []*PrincipalNetworkDomain `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetPndListResponse) Reset() { @@ -292,12 +288,11 @@ func (x *GetPndListResponse) GetPnd() []*PrincipalNetworkDomain { } type CreatePndListRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pnd []*PndCreateProperties `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pnd []*PndCreateProperties `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreatePndListRequest) Reset() { @@ -345,12 +340,11 @@ func (x *CreatePndListRequest) GetPnd() []*PndCreateProperties { } type PndCreateProperties struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PndCreateProperties) Reset() { @@ -398,11 +392,10 @@ func (x *PndCreateProperties) GetDescription() string { } type CreatePndListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *CreatePndListResponse) Reset() { @@ -443,12 +436,11 @@ func (x *CreatePndListResponse) GetTimestamp() int64 { } type DeletePndRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeletePndRequest) Reset() { @@ -496,11 +488,10 @@ func (x *DeletePndRequest) GetPid() string { } type DeletePndResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + sizeCache protoimpl.SizeCache } func (x *DeletePndResponse) Reset() { @@ -542,7 +533,7 @@ func (x *DeletePndResponse) GetTimestamp() int64 { var File_gosdn_pnd_pnd_proto protoreflect.FileDescriptor -var file_gosdn_pnd_pnd_proto_rawDesc = []byte{ +var file_gosdn_pnd_pnd_proto_rawDesc = string([]byte{ 0x0a, 0x13, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x70, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, @@ -653,16 +644,16 @@ var file_gosdn_pnd_pnd_proto_rawDesc = []byte{ 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_pnd_pnd_proto_rawDescOnce sync.Once - file_gosdn_pnd_pnd_proto_rawDescData = file_gosdn_pnd_pnd_proto_rawDesc + file_gosdn_pnd_pnd_proto_rawDescData []byte ) func file_gosdn_pnd_pnd_proto_rawDescGZIP() []byte { file_gosdn_pnd_pnd_proto_rawDescOnce.Do(func() { - file_gosdn_pnd_pnd_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_pnd_pnd_proto_rawDescData) + file_gosdn_pnd_pnd_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_pnd_pnd_proto_rawDesc), len(file_gosdn_pnd_pnd_proto_rawDesc))) }) return file_gosdn_pnd_pnd_proto_rawDescData } @@ -708,7 +699,7 @@ func file_gosdn_pnd_pnd_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_pnd_pnd_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_pnd_pnd_proto_rawDesc), len(file_gosdn_pnd_pnd_proto_rawDesc)), NumEnums: 0, NumMessages: 10, NumExtensions: 0, @@ -719,7 +710,6 @@ func file_gosdn_pnd_pnd_proto_init() { MessageInfos: file_gosdn_pnd_pnd_proto_msgTypes, }.Build() File_gosdn_pnd_pnd_proto = out.File - file_gosdn_pnd_pnd_proto_rawDesc = nil file_gosdn_pnd_pnd_proto_goTypes = nil file_gosdn_pnd_pnd_proto_depIdxs = nil } diff --git a/api/go/gosdn/pnd/pnd.pb.gw.go b/api/go/gosdn/pnd/pnd.pb.gw.go index 6aace9934..7ea08d765 100755 --- a/api/go/gosdn/pnd/pnd.pb.gw.go +++ b/api/go/gosdn/pnd/pnd.pb.gw.go @@ -10,6 +10,7 @@ package pnd import ( "context" + "errors" "io" "net/http" @@ -24,213 +25,170 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join - var ( - filter_PndService_GetPnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join ) -func request_PndService_GetPnd_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPndRequest - var metadata runtime.ServerMetadata +var filter_PndService_GetPnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +func request_PndService_GetPnd_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - val string - ok bool - err error - _ = err + protoReq GetPndRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPnd_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetPnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PndService_GetPnd_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPndRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetPndRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPnd_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetPnd(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_PndService_GetPndList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_PndService_GetPndList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_PndService_GetPndList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPndListRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetPndListRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPndList_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetPndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PndService_GetPndList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetPndListRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetPndListRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPndList_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetPndList(ctx, &protoReq) return msg, metadata, err - } func request_PndService_CreatePndList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreatePndListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreatePndListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreatePndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PndService_CreatePndList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreatePndListRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreatePndListRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreatePndList(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_PndService_DeletePnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_PndService_DeletePnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_PndService_DeletePnd_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeletePndRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeletePndRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_DeletePnd_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeletePnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_PndService_DeletePnd_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeletePndRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeletePndRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["pid"] + val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") } - protoReq.Pid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_DeletePnd_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeletePnd(ctx, &protoReq) return msg, metadata, err - } // RegisterPndServiceHandlerServer registers the http handlers for service PndService to "mux". @@ -239,16 +197,13 @@ func local_request_PndService_DeletePnd_0(ctx context.Context, marshaler runtime // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPndServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterPndServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PndServiceServer) error { - - mux.Handle("GET", pattern_PndService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PndService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -260,20 +215,15 @@ func RegisterPndServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_GetPnd_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_PndService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PndService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPndList", runtime.WithHTTPPathPattern("/pnds")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPndList", runtime.WithHTTPPathPattern("/pnds")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -285,20 +235,15 @@ func RegisterPndServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_GetPndList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_PndService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_PndService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/CreatePndList", runtime.WithHTTPPathPattern("/pnds")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/CreatePndList", runtime.WithHTTPPathPattern("/pnds")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -310,20 +255,15 @@ func RegisterPndServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_CreatePndList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_PndService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_PndService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -335,9 +275,7 @@ func RegisterPndServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_DeletePnd_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -364,7 +302,6 @@ func RegisterPndServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Ser } }() }() - return RegisterPndServiceHandler(ctx, mux, conn) } @@ -380,14 +317,11 @@ func RegisterPndServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "PndServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterPndServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PndServiceClient) error { - - mux.Handle("GET", pattern_PndService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PndService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -398,18 +332,13 @@ func RegisterPndServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_GetPnd_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_PndService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PndService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPndList", runtime.WithHTTPPathPattern("/pnds")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPndList", runtime.WithHTTPPathPattern("/pnds")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -420,18 +349,13 @@ func RegisterPndServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_GetPndList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_PndService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_PndService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/CreatePndList", runtime.WithHTTPPathPattern("/pnds")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/CreatePndList", runtime.WithHTTPPathPattern("/pnds")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -442,18 +366,13 @@ func RegisterPndServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_CreatePndList_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_PndService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_PndService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -464,30 +383,21 @@ func RegisterPndServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PndService_DeletePnd_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_PndService_GetPnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnd", "pid"}, "")) - - pattern_PndService_GetPndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"pnds"}, "")) - + pattern_PndService_GetPnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnd", "pid"}, "")) + pattern_PndService_GetPndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"pnds"}, "")) pattern_PndService_CreatePndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"pnds"}, "")) - - pattern_PndService_DeletePnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnds", "pid"}, "")) + pattern_PndService_DeletePnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnds", "pid"}, "")) ) var ( - forward_PndService_GetPnd_0 = runtime.ForwardResponseMessage - - forward_PndService_GetPndList_0 = runtime.ForwardResponseMessage - + forward_PndService_GetPnd_0 = runtime.ForwardResponseMessage + forward_PndService_GetPndList_0 = runtime.ForwardResponseMessage forward_PndService_CreatePndList_0 = runtime.ForwardResponseMessage - - forward_PndService_DeletePnd_0 = runtime.ForwardResponseMessage + forward_PndService_DeletePnd_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/rbac/rbac.pb.go b/api/go/gosdn/rbac/rbac.pb.go index 0a98e9ecf..29e570c59 100755 --- a/api/go/gosdn/rbac/rbac.pb.go +++ b/api/go/gosdn/rbac/rbac.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/rbac/rbac.proto @@ -15,6 +15,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -26,13 +27,12 @@ const ( // Login type LoginRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + Pwd string `protobuf:"bytes,3,opt,name=pwd,proto3" json:"pwd,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` - Pwd string `protobuf:"bytes,3,opt,name=pwd,proto3" json:"pwd,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginRequest) Reset() { @@ -87,12 +87,11 @@ func (x *LoginRequest) GetPwd() string { } type LoginResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginResponse) Reset() { @@ -141,12 +140,11 @@ func (x *LoginResponse) GetToken() string { // Logout type LogoutRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LogoutRequest) Reset() { @@ -194,11 +192,10 @@ func (x *LogoutRequest) GetUsername() string { } type LogoutResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LogoutResponse) Reset() { @@ -240,7 +237,7 @@ func (x *LogoutResponse) GetTimestamp() int64 { var File_gosdn_rbac_rbac_proto protoreflect.FileDescriptor -var file_gosdn_rbac_rbac_proto_rawDesc = []byte{ +var file_gosdn_rbac_rbac_proto_rawDesc = string([]byte{ 0x0a, 0x15, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, @@ -287,16 +284,16 @@ var file_gosdn_rbac_rbac_proto_rawDesc = []byte{ 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_rbac_rbac_proto_rawDescOnce sync.Once - file_gosdn_rbac_rbac_proto_rawDescData = file_gosdn_rbac_rbac_proto_rawDesc + file_gosdn_rbac_rbac_proto_rawDescData []byte ) func file_gosdn_rbac_rbac_proto_rawDescGZIP() []byte { file_gosdn_rbac_rbac_proto_rawDescOnce.Do(func() { - file_gosdn_rbac_rbac_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_rbac_rbac_proto_rawDescData) + file_gosdn_rbac_rbac_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_rbac_rbac_proto_rawDesc), len(file_gosdn_rbac_rbac_proto_rawDesc))) }) return file_gosdn_rbac_rbac_proto_rawDescData } @@ -329,7 +326,7 @@ func file_gosdn_rbac_rbac_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_rbac_rbac_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_rbac_rbac_proto_rawDesc), len(file_gosdn_rbac_rbac_proto_rawDesc)), NumEnums: 0, NumMessages: 4, NumExtensions: 0, @@ -340,7 +337,6 @@ func file_gosdn_rbac_rbac_proto_init() { MessageInfos: file_gosdn_rbac_rbac_proto_msgTypes, }.Build() File_gosdn_rbac_rbac_proto = out.File - file_gosdn_rbac_rbac_proto_rawDesc = nil file_gosdn_rbac_rbac_proto_goTypes = nil file_gosdn_rbac_rbac_proto_depIdxs = nil } diff --git a/api/go/gosdn/rbac/rbac.pb.gw.go b/api/go/gosdn/rbac/rbac.pb.gw.go index 46167531e..6a89867f0 100755 --- a/api/go/gosdn/rbac/rbac.pb.gw.go +++ b/api/go/gosdn/rbac/rbac.pb.gw.go @@ -10,6 +10,7 @@ package rbac import ( "context" + "errors" "io" "net/http" @@ -24,107 +25,88 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_AuthService_Login_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq LoginRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Login(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_AuthService_Login_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq LoginRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Login(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_AuthService_Logout_0 = &utilities.DoubleArray{Encoding: map[string]int{"username": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_AuthService_Logout_0 = &utilities.DoubleArray{Encoding: map[string]int{"username": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_AuthService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LogoutRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq LogoutRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["username"] + val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") } - protoReq.Username, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "username", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_Logout_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Logout(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_AuthService_Logout_0(ctx context.Context, marshaler runtime.Marshaler, server AuthServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LogoutRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq LogoutRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["username"] + val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") } - protoReq.Username, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "username", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AuthService_Logout_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Logout(ctx, &protoReq) return msg, metadata, err - } // RegisterAuthServiceHandlerServer registers the http handlers for service AuthService to "mux". @@ -133,16 +115,13 @@ func local_request_AuthService_Logout_0(ctx context.Context, marshaler runtime.M // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuthServiceServer) error { - - mux.Handle("POST", pattern_AuthService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AuthService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.AuthService/Login", runtime.WithHTTPPathPattern("/login")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.AuthService/Login", runtime.WithHTTPPathPattern("/login")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -154,20 +133,15 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AuthService_Login_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_AuthService_Logout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AuthService_Logout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.AuthService/Logout", runtime.WithHTTPPathPattern("/logout/{username}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.AuthService/Logout", runtime.WithHTTPPathPattern("/logout/{username}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -179,9 +153,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AuthService_Logout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -208,7 +180,6 @@ func RegisterAuthServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Se } }() }() - return RegisterAuthServiceHandler(ctx, mux, conn) } @@ -224,14 +195,11 @@ func RegisterAuthServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "AuthServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AuthServiceClient) error { - - mux.Handle("POST", pattern_AuthService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AuthService_Login_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.AuthService/Login", runtime.WithHTTPPathPattern("/login")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.AuthService/Login", runtime.WithHTTPPathPattern("/login")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -242,18 +210,13 @@ func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AuthService_Login_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_AuthService_Logout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_AuthService_Logout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.AuthService/Logout", runtime.WithHTTPPathPattern("/logout/{username}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.AuthService/Logout", runtime.WithHTTPPathPattern("/logout/{username}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -264,22 +227,17 @@ func RegisterAuthServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_AuthService_Logout_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_AuthService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"login"}, "")) - + pattern_AuthService_Login_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"login"}, "")) pattern_AuthService_Logout_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"logout", "username"}, "")) ) var ( - forward_AuthService_Login_0 = runtime.ForwardResponseMessage - + forward_AuthService_Login_0 = runtime.ForwardResponseMessage forward_AuthService_Logout_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/rbac/role.pb.go b/api/go/gosdn/rbac/role.pb.go index aacf29035..66c89c2f7 100755 --- a/api/go/gosdn/rbac/role.pb.go +++ b/api/go/gosdn/rbac/role.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/rbac/role.proto @@ -15,6 +15,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -25,14 +26,13 @@ const ( ) type Role struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Permissions []string `protobuf:"bytes,4,rep,name=permissions,proto3" json:"permissions,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - Permissions []string `protobuf:"bytes,4,rep,name=permissions,proto3" json:"permissions,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Role) Reset() { @@ -95,12 +95,11 @@ func (x *Role) GetPermissions() []string { // CreateRoles type CreateRolesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Roles []*Role `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Roles []*Role `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateRolesRequest) Reset() { @@ -148,11 +147,10 @@ func (x *CreateRolesRequest) GetRoles() []*Role { } type CreateRolesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateRolesResponse) Reset() { @@ -194,13 +192,12 @@ func (x *CreateRolesResponse) GetTimestamp() int64 { // GetRole type GetRoleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRoleRequest) Reset() { @@ -255,12 +252,11 @@ func (x *GetRoleRequest) GetId() string { } type GetRoleResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Role *Role `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Role *Role `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRoleResponse) Reset() { @@ -309,11 +305,10 @@ func (x *GetRoleResponse) GetRole() *Role { // GetRoles type GetRolesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRolesRequest) Reset() { @@ -354,12 +349,11 @@ func (x *GetRolesRequest) GetTimestamp() int64 { } type GetRolesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Roles []*Role `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Roles []*Role `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRolesResponse) Reset() { @@ -408,12 +402,11 @@ func (x *GetRolesResponse) GetRoles() []*Role { // UpdateRoles type UpdateRolesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Roles []*Role `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Roles []*Role `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateRolesRequest) Reset() { @@ -461,11 +454,10 @@ func (x *UpdateRolesRequest) GetRoles() []*Role { } type UpdateRolesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateRolesResponse) Reset() { @@ -507,13 +499,12 @@ func (x *UpdateRolesResponse) GetTimestamp() int64 { // DeletePermissionsForRole type DeletePermissionsForRoleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` - PermissionsToDelete []string `protobuf:"bytes,3,rep,name=permissions_to_delete,json=permissionsToDelete,proto3" json:"permissions_to_delete,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + PermissionsToDelete []string `protobuf:"bytes,3,rep,name=permissions_to_delete,json=permissionsToDelete,proto3" json:"permissions_to_delete,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DeletePermissionsForRoleRequest) Reset() { @@ -568,11 +559,10 @@ func (x *DeletePermissionsForRoleRequest) GetPermissionsToDelete() []string { } type DeletePermissionsForRoleResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeletePermissionsForRoleResponse) Reset() { @@ -614,12 +604,11 @@ func (x *DeletePermissionsForRoleResponse) GetTimestamp() int64 { // DeleteRoles type DeleteRolesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RoleName []string `protobuf:"bytes,2,rep,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RoleName []string `protobuf:"bytes,2,rep,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRolesRequest) Reset() { @@ -667,11 +656,10 @@ func (x *DeleteRolesRequest) GetRoleName() []string { } type DeleteRolesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRolesResponse) Reset() { @@ -713,7 +701,7 @@ func (x *DeleteRolesResponse) GetTimestamp() int64 { var File_gosdn_rbac_role_proto protoreflect.FileDescriptor -var file_gosdn_rbac_role_proto_rawDesc = []byte{ +var file_gosdn_rbac_role_proto_rawDesc = string([]byte{ 0x0a, 0x15, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, @@ -842,16 +830,16 @@ var file_gosdn_rbac_role_proto_rawDesc = []byte{ 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_rbac_role_proto_rawDescOnce sync.Once - file_gosdn_rbac_role_proto_rawDescData = file_gosdn_rbac_role_proto_rawDesc + file_gosdn_rbac_role_proto_rawDescData []byte ) func file_gosdn_rbac_role_proto_rawDescGZIP() []byte { file_gosdn_rbac_role_proto_rawDescOnce.Do(func() { - file_gosdn_rbac_role_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_rbac_role_proto_rawDescData) + file_gosdn_rbac_role_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_rbac_role_proto_rawDesc), len(file_gosdn_rbac_role_proto_rawDesc))) }) return file_gosdn_rbac_role_proto_rawDescData } @@ -906,7 +894,7 @@ func file_gosdn_rbac_role_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_rbac_role_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_rbac_role_proto_rawDesc), len(file_gosdn_rbac_role_proto_rawDesc)), NumEnums: 0, NumMessages: 13, NumExtensions: 0, @@ -917,7 +905,6 @@ func file_gosdn_rbac_role_proto_init() { MessageInfos: file_gosdn_rbac_role_proto_msgTypes, }.Build() File_gosdn_rbac_role_proto = out.File - file_gosdn_rbac_role_proto_rawDesc = nil file_gosdn_rbac_role_proto_goTypes = nil file_gosdn_rbac_role_proto_depIdxs = nil } diff --git a/api/go/gosdn/rbac/role.pb.gw.go b/api/go/gosdn/rbac/role.pb.gw.go index 454fe45f0..a30fb131d 100755 --- a/api/go/gosdn/rbac/role.pb.gw.go +++ b/api/go/gosdn/rbac/role.pb.gw.go @@ -10,6 +10,7 @@ package rbac import ( "context" + "errors" "io" "net/http" @@ -24,207 +25,190 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_RoleService_CreateRoles_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateRolesRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateRolesRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoleService_CreateRoles_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateRolesRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateRolesRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateRoles(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RoleService_GetRole_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RoleService_GetRole_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RoleService_GetRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRoleRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetRoleRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_GetRole_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoleService_GetRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRoleRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetRoleRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_GetRole_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetRole(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RoleService_GetRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RoleService_GetRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RoleService_GetRoles_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRolesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetRolesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_GetRoles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoleService_GetRoles_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRolesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetRolesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_GetRoles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetRoles(ctx, &protoReq) return msg, metadata, err - } func request_RoleService_UpdateRoles_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateRolesRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateRolesRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoleService_UpdateRoles_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateRolesRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateRolesRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateRoles(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RoleService_DeletePermissionsForRole_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RoleService_DeletePermissionsForRole_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RoleService_DeletePermissionsForRole_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeletePermissionsForRoleRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeletePermissionsForRoleRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_DeletePermissionsForRole_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeletePermissionsForRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoleService_DeletePermissionsForRole_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeletePermissionsForRoleRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeletePermissionsForRoleRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_DeletePermissionsForRole_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeletePermissionsForRole(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RoleService_DeleteRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RoleService_DeleteRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RoleService_DeleteRoles_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRolesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteRolesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_DeleteRoles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoleService_DeleteRoles_0(ctx context.Context, marshaler runtime.Marshaler, server RoleServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRolesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteRolesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_DeleteRoles_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteRoles(ctx, &protoReq) return msg, metadata, err - } // RegisterRoleServiceHandlerServer registers the http handlers for service RoleService to "mux". @@ -233,16 +217,13 @@ func local_request_RoleService_DeleteRoles_0(ctx context.Context, marshaler runt // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterRoleServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoleServiceServer) error { - - mux.Handle("POST", pattern_RoleService_CreateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RoleService_CreateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/CreateRoles", runtime.WithHTTPPathPattern("/roles/create")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/CreateRoles", runtime.WithHTTPPathPattern("/roles/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -254,20 +235,15 @@ func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_CreateRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RoleService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RoleService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRole", runtime.WithHTTPPathPattern("/roles/get")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRole", runtime.WithHTTPPathPattern("/roles/get")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -279,20 +255,15 @@ func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_GetRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RoleService_GetRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RoleService_GetRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRoles", runtime.WithHTTPPathPattern("/roles")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRoles", runtime.WithHTTPPathPattern("/roles")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -304,20 +275,15 @@ func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_GetRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_RoleService_UpdateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RoleService_UpdateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/UpdateRoles", runtime.WithHTTPPathPattern("/roles/update")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/UpdateRoles", runtime.WithHTTPPathPattern("/roles/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -329,20 +295,15 @@ func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_UpdateRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RoleService_DeletePermissionsForRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RoleService_DeletePermissionsForRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeletePermissionsForRole", runtime.WithHTTPPathPattern("/roles/delete/permissions")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeletePermissionsForRole", runtime.WithHTTPPathPattern("/roles/delete/permissions")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -354,20 +315,15 @@ func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_DeletePermissionsForRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RoleService_DeleteRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RoleService_DeleteRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeleteRoles", runtime.WithHTTPPathPattern("/roles/delete")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeleteRoles", runtime.WithHTTPPathPattern("/roles/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -379,9 +335,7 @@ func RegisterRoleServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_DeleteRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -408,7 +362,6 @@ func RegisterRoleServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Se } }() }() - return RegisterRoleServiceHandler(ctx, mux, conn) } @@ -424,14 +377,11 @@ func RegisterRoleServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "RoleServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoleServiceClient) error { - - mux.Handle("POST", pattern_RoleService_CreateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RoleService_CreateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/CreateRoles", runtime.WithHTTPPathPattern("/roles/create")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/CreateRoles", runtime.WithHTTPPathPattern("/roles/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -442,18 +392,13 @@ func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_CreateRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RoleService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RoleService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRole", runtime.WithHTTPPathPattern("/roles/get")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRole", runtime.WithHTTPPathPattern("/roles/get")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -464,18 +409,13 @@ func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_GetRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RoleService_GetRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RoleService_GetRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRoles", runtime.WithHTTPPathPattern("/roles")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/GetRoles", runtime.WithHTTPPathPattern("/roles")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -486,18 +426,13 @@ func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_GetRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_RoleService_UpdateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RoleService_UpdateRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/UpdateRoles", runtime.WithHTTPPathPattern("/roles/update")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/UpdateRoles", runtime.WithHTTPPathPattern("/roles/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -508,18 +443,13 @@ func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_UpdateRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RoleService_DeletePermissionsForRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RoleService_DeletePermissionsForRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeletePermissionsForRole", runtime.WithHTTPPathPattern("/roles/delete/permissions")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeletePermissionsForRole", runtime.WithHTTPPathPattern("/roles/delete/permissions")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -530,18 +460,13 @@ func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_DeletePermissionsForRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RoleService_DeleteRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RoleService_DeleteRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeleteRoles", runtime.WithHTTPPathPattern("/roles/delete")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.RoleService/DeleteRoles", runtime.WithHTTPPathPattern("/roles/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -552,38 +477,25 @@ func RegisterRoleServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoleService_DeleteRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_RoleService_CreateRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "create"}, "")) - - pattern_RoleService_GetRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "get"}, "")) - - pattern_RoleService_GetRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"roles"}, "")) - - pattern_RoleService_UpdateRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "update"}, "")) - + pattern_RoleService_CreateRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "create"}, "")) + pattern_RoleService_GetRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "get"}, "")) + pattern_RoleService_GetRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"roles"}, "")) + pattern_RoleService_UpdateRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "update"}, "")) pattern_RoleService_DeletePermissionsForRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"roles", "delete", "permissions"}, "")) - - pattern_RoleService_DeleteRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "delete"}, "")) + pattern_RoleService_DeleteRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"roles", "delete"}, "")) ) var ( - forward_RoleService_CreateRoles_0 = runtime.ForwardResponseMessage - - forward_RoleService_GetRole_0 = runtime.ForwardResponseMessage - - forward_RoleService_GetRoles_0 = runtime.ForwardResponseMessage - - forward_RoleService_UpdateRoles_0 = runtime.ForwardResponseMessage - + forward_RoleService_CreateRoles_0 = runtime.ForwardResponseMessage + forward_RoleService_GetRole_0 = runtime.ForwardResponseMessage + forward_RoleService_GetRoles_0 = runtime.ForwardResponseMessage + forward_RoleService_UpdateRoles_0 = runtime.ForwardResponseMessage forward_RoleService_DeletePermissionsForRole_0 = runtime.ForwardResponseMessage - - forward_RoleService_DeleteRoles_0 = runtime.ForwardResponseMessage + forward_RoleService_DeleteRoles_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/rbac/user.pb.go b/api/go/gosdn/rbac/user.pb.go index 6c5c74f57..6c413ce8c 100755 --- a/api/go/gosdn/rbac/user.pb.go +++ b/api/go/gosdn/rbac/user.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/rbac/user.proto @@ -16,6 +16,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -26,16 +27,15 @@ const ( ) type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Roles map[string]string `protobuf:"bytes,3,rep,name=roles,proto3" json:"roles,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Key = pnd uuid, value= role name + Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` + Token string `protobuf:"bytes,5,opt,name=token,proto3" json:"token,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Roles map[string]string `protobuf:"bytes,3,rep,name=roles,proto3" json:"roles,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Key = pnd uuid, value= role name - Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` - Token string `protobuf:"bytes,5,opt,name=token,proto3" json:"token,omitempty"` - Metadata *conflict.Metadata `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` + sizeCache protoimpl.SizeCache } func (x *User) Reset() { @@ -111,16 +111,15 @@ func (x *User) GetMetadata() *conflict.Metadata { } type UpdateUser struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Roles map[string]string `protobuf:"bytes,3,rep,name=roles,proto3" json:"roles,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Key = pnd uuid, value= role name + Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` + Token string `protobuf:"bytes,5,opt,name=token,proto3" json:"token,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Roles map[string]string `protobuf:"bytes,3,rep,name=roles,proto3" json:"roles,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Key = pnd uuid, value= role name - Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` - Token string `protobuf:"bytes,5,opt,name=token,proto3" json:"token,omitempty"` - Metadata *conflict.Metadata `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateUser) Reset() { @@ -197,12 +196,11 @@ func (x *UpdateUser) GetMetadata() *conflict.Metadata { // CreateUsers type CreateUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + User []*User `protobuf:"bytes,2,rep,name=user,proto3" json:"user,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - User []*User `protobuf:"bytes,2,rep,name=user,proto3" json:"user,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateUsersRequest) Reset() { @@ -250,11 +248,10 @@ func (x *CreateUsersRequest) GetUser() []*User { } type CreateUsersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateUsersResponse) Reset() { @@ -296,13 +293,12 @@ func (x *CreateUsersResponse) GetTimestamp() int64 { // GetUser type GetUserRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // TODO(faseid): reconsider if this is necessary as required, but id is not? + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // TODO(faseid): reconsider if this is necessary as required, but id is not? - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetUserRequest) Reset() { @@ -357,12 +353,11 @@ func (x *GetUserRequest) GetId() string { } type GetUserResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetUserResponse) Reset() { @@ -411,11 +406,10 @@ func (x *GetUserResponse) GetUser() *User { // GetUsers type GetUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetUsersRequest) Reset() { @@ -456,12 +450,11 @@ func (x *GetUsersRequest) GetTimestamp() int64 { } type GetUsersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + User []*User `protobuf:"bytes,2,rep,name=user,proto3" json:"user,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - User []*User `protobuf:"bytes,2,rep,name=user,proto3" json:"user,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetUsersResponse) Reset() { @@ -510,12 +503,11 @@ func (x *GetUsersResponse) GetUser() []*User { // UpdateUsers type UpdateUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + User []*UpdateUser `protobuf:"bytes,2,rep,name=user,proto3" json:"user,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - User []*UpdateUser `protobuf:"bytes,2,rep,name=user,proto3" json:"user,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateUsersRequest) Reset() { @@ -563,11 +555,10 @@ func (x *UpdateUsersRequest) GetUser() []*UpdateUser { } type UpdateUsersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateUsersResponse) Reset() { @@ -609,12 +600,11 @@ func (x *UpdateUsersResponse) GetTimestamp() int64 { // DeleteUsers type DeleteUsersRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Username []string `protobuf:"bytes,2,rep,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Username []string `protobuf:"bytes,2,rep,name=username,proto3" json:"username,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteUsersRequest) Reset() { @@ -662,11 +652,10 @@ func (x *DeleteUsersRequest) GetUsername() []string { } type DeleteUsersResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteUsersResponse) Reset() { @@ -708,7 +697,7 @@ func (x *DeleteUsersResponse) GetTimestamp() int64 { var File_gosdn_rbac_user_proto protoreflect.FileDescriptor -var file_gosdn_rbac_user_proto_rawDesc = []byte{ +var file_gosdn_rbac_user_proto_rawDesc = string([]byte{ 0x0a, 0x15, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x72, 0x62, 0x61, 0x63, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, @@ -841,16 +830,16 @@ var file_gosdn_rbac_user_proto_rawDesc = []byte{ 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x72, 0x62, 0x61, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_rbac_user_proto_rawDescOnce sync.Once - file_gosdn_rbac_user_proto_rawDescData = file_gosdn_rbac_user_proto_rawDesc + file_gosdn_rbac_user_proto_rawDescData []byte ) func file_gosdn_rbac_user_proto_rawDescGZIP() []byte { file_gosdn_rbac_user_proto_rawDescOnce.Do(func() { - file_gosdn_rbac_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_rbac_user_proto_rawDescData) + file_gosdn_rbac_user_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_rbac_user_proto_rawDesc), len(file_gosdn_rbac_user_proto_rawDesc))) }) return file_gosdn_rbac_user_proto_rawDescData } @@ -909,7 +898,7 @@ func file_gosdn_rbac_user_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_rbac_user_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_rbac_user_proto_rawDesc), len(file_gosdn_rbac_user_proto_rawDesc)), NumEnums: 0, NumMessages: 14, NumExtensions: 0, @@ -920,7 +909,6 @@ func file_gosdn_rbac_user_proto_init() { MessageInfos: file_gosdn_rbac_user_proto_msgTypes, }.Build() File_gosdn_rbac_user_proto = out.File - file_gosdn_rbac_user_proto_rawDesc = nil file_gosdn_rbac_user_proto_goTypes = nil file_gosdn_rbac_user_proto_depIdxs = nil } diff --git a/api/go/gosdn/rbac/user.pb.gw.go b/api/go/gosdn/rbac/user.pb.gw.go index 2103e85b5..ebe07c3c0 100755 --- a/api/go/gosdn/rbac/user.pb.gw.go +++ b/api/go/gosdn/rbac/user.pb.gw.go @@ -10,6 +10,7 @@ package rbac import ( "context" + "errors" "io" "net/http" @@ -24,171 +25,158 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_UserService_CreateUsers_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateUsersRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateUsersRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.CreateUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_CreateUsers_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CreateUsersRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq CreateUsersRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.CreateUsers(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_UserService_GetUser_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_UserService_GetUser_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUserRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetUserRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_GetUser_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUserRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetUserRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_GetUser_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetUser(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_UserService_GetUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_UserService_GetUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_UserService_GetUsers_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUsersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetUsersRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_GetUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_GetUsers_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetUsersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetUsersRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_GetUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetUsers(ctx, &protoReq) return msg, metadata, err - } func request_UserService_UpdateUsers_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateUsersRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateUsersRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_UpdateUsers_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateUsersRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateUsersRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateUsers(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_UserService_DeleteUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_UserService_DeleteUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_UserService_DeleteUsers_0(ctx context.Context, marshaler runtime.Marshaler, client UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteUsersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteUsersRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_DeleteUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_UserService_DeleteUsers_0(ctx context.Context, marshaler runtime.Marshaler, server UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteUsersRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteUsersRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_DeleteUsers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteUsers(ctx, &protoReq) return msg, metadata, err - } // RegisterUserServiceHandlerServer registers the http handlers for service UserService to "mux". @@ -197,16 +185,13 @@ func local_request_UserService_DeleteUsers_0(ctx context.Context, marshaler runt // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterUserServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server UserServiceServer) error { - - mux.Handle("POST", pattern_UserService_CreateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_UserService_CreateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/CreateUsers", runtime.WithHTTPPathPattern("/users/create")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/CreateUsers", runtime.WithHTTPPathPattern("/users/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -218,20 +203,15 @@ func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_CreateUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUser", runtime.WithHTTPPathPattern("/users/get")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUser", runtime.WithHTTPPathPattern("/users/get")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -243,20 +223,15 @@ func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_GetUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_UserService_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_UserService_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUsers", runtime.WithHTTPPathPattern("/users")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUsers", runtime.WithHTTPPathPattern("/users")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -268,20 +243,15 @@ func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_GetUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_UserService_UpdateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_UserService_UpdateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/UpdateUsers", runtime.WithHTTPPathPattern("/users/update")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/UpdateUsers", runtime.WithHTTPPathPattern("/users/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -293,20 +263,15 @@ func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_UpdateUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_UserService_DeleteUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_UserService_DeleteUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/DeleteUsers", runtime.WithHTTPPathPattern("/users/delete")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.rbac.UserService/DeleteUsers", runtime.WithHTTPPathPattern("/users/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -318,9 +283,7 @@ func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_DeleteUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -347,7 +310,6 @@ func RegisterUserServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.Se } }() }() - return RegisterUserServiceHandler(ctx, mux, conn) } @@ -363,14 +325,11 @@ func RegisterUserServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "UserServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client UserServiceClient) error { - - mux.Handle("POST", pattern_UserService_CreateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_UserService_CreateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/CreateUsers", runtime.WithHTTPPathPattern("/users/create")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/CreateUsers", runtime.WithHTTPPathPattern("/users/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -381,18 +340,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_CreateUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUser", runtime.WithHTTPPathPattern("/users/get")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUser", runtime.WithHTTPPathPattern("/users/get")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -403,18 +357,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_GetUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_UserService_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_UserService_GetUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUsers", runtime.WithHTTPPathPattern("/users")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/GetUsers", runtime.WithHTTPPathPattern("/users")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -425,18 +374,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_GetUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_UserService_UpdateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_UserService_UpdateUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/UpdateUsers", runtime.WithHTTPPathPattern("/users/update")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/UpdateUsers", runtime.WithHTTPPathPattern("/users/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -447,18 +391,13 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_UpdateUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_UserService_DeleteUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_UserService_DeleteUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/DeleteUsers", runtime.WithHTTPPathPattern("/users/delete")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.rbac.UserService/DeleteUsers", runtime.WithHTTPPathPattern("/users/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -469,34 +408,23 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_UserService_DeleteUsers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( pattern_UserService_CreateUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"users", "create"}, "")) - - pattern_UserService_GetUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"users", "get"}, "")) - - pattern_UserService_GetUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"users"}, "")) - + pattern_UserService_GetUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"users", "get"}, "")) + pattern_UserService_GetUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"users"}, "")) pattern_UserService_UpdateUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"users", "update"}, "")) - pattern_UserService_DeleteUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"users", "delete"}, "")) ) var ( forward_UserService_CreateUsers_0 = runtime.ForwardResponseMessage - - forward_UserService_GetUser_0 = runtime.ForwardResponseMessage - - forward_UserService_GetUsers_0 = runtime.ForwardResponseMessage - + forward_UserService_GetUser_0 = runtime.ForwardResponseMessage + forward_UserService_GetUsers_0 = runtime.ForwardResponseMessage forward_UserService_UpdateUsers_0 = runtime.ForwardResponseMessage - forward_UserService_DeleteUsers_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/southbound/southbound.pb.go b/api/go/gosdn/southbound/southbound.pb.go index bf475590f..ea26197dc 100755 --- a/api/go/gosdn/southbound/southbound.pb.go +++ b/api/go/gosdn/southbound/southbound.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/southbound/southbound.proto @@ -12,6 +12,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -76,13 +77,12 @@ func (Type) EnumDescriptor() ([]byte, []int) { } type GetSchemaRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + Sid string `protobuf:"bytes,3,opt,name=sid,proto3" json:"sid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` - Sid string `protobuf:"bytes,3,opt,name=sid,proto3" json:"sid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetSchemaRequest) Reset() { @@ -137,11 +137,10 @@ func (x *GetSchemaRequest) GetSid() string { } type Payload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` unknownFields protoimpl.UnknownFields - - Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Payload) Reset() { @@ -182,12 +181,11 @@ func (x *Payload) GetChunk() []byte { } type SouthboundInterface struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type Type `protobuf:"varint,2,opt,name=type,proto3,enum=gosdn.southbound.Type" json:"type,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type Type `protobuf:"varint,2,opt,name=type,proto3,enum=gosdn.southbound.Type" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SouthboundInterface) Reset() { @@ -236,7 +234,7 @@ func (x *SouthboundInterface) GetType() Type { var File_gosdn_southbound_southbound_proto protoreflect.FileDescriptor -var file_gosdn_southbound_southbound_proto_rawDesc = []byte{ +var file_gosdn_southbound_southbound_proto_rawDesc = string([]byte{ 0x0a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, @@ -271,16 +269,16 @@ var file_gosdn_southbound_southbound_proto_rawDesc = []byte{ 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_southbound_southbound_proto_rawDescOnce sync.Once - file_gosdn_southbound_southbound_proto_rawDescData = file_gosdn_southbound_southbound_proto_rawDesc + file_gosdn_southbound_southbound_proto_rawDescData []byte ) func file_gosdn_southbound_southbound_proto_rawDescGZIP() []byte { file_gosdn_southbound_southbound_proto_rawDescOnce.Do(func() { - file_gosdn_southbound_southbound_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_southbound_southbound_proto_rawDescData) + file_gosdn_southbound_southbound_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_southbound_southbound_proto_rawDesc), len(file_gosdn_southbound_southbound_proto_rawDesc))) }) return file_gosdn_southbound_southbound_proto_rawDescData } @@ -313,7 +311,7 @@ func file_gosdn_southbound_southbound_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_southbound_southbound_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_southbound_southbound_proto_rawDesc), len(file_gosdn_southbound_southbound_proto_rawDesc)), NumEnums: 1, NumMessages: 3, NumExtensions: 0, @@ -325,7 +323,6 @@ func file_gosdn_southbound_southbound_proto_init() { MessageInfos: file_gosdn_southbound_southbound_proto_msgTypes, }.Build() File_gosdn_southbound_southbound_proto = out.File - file_gosdn_southbound_southbound_proto_rawDesc = nil file_gosdn_southbound_southbound_proto_goTypes = nil file_gosdn_southbound_southbound_proto_depIdxs = nil } diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go index 1691a7cf1..6bfb0e28a 100755 --- a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go +++ b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/subscriptionmanagement/subscriptionmanagement.proto @@ -14,6 +14,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -24,16 +25,15 @@ const ( ) type Subscription struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Subid string `protobuf:"bytes,1,opt,name=subid,proto3" json:"subid,omitempty"` - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` - Mneid string `protobuf:"bytes,3,opt,name=mneid,proto3" json:"mneid,omitempty"` - MneName string `protobuf:"bytes,4,opt,name=mne_name,json=mneName,proto3" json:"mne_name,omitempty"` - Paths []*Path `protobuf:"bytes,5,rep,name=paths,proto3" json:"paths,omitempty"` - SubscribeOptions *SubscribeOptions `protobuf:"bytes,6,opt,name=subscribe_options,json=subscribeOptions,proto3" json:"subscribe_options,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Subid string `protobuf:"bytes,1,opt,name=subid,proto3" json:"subid,omitempty"` + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + Mneid string `protobuf:"bytes,3,opt,name=mneid,proto3" json:"mneid,omitempty"` + MneName string `protobuf:"bytes,4,opt,name=mne_name,json=mneName,proto3" json:"mne_name,omitempty"` + Paths []*Path `protobuf:"bytes,5,rep,name=paths,proto3" json:"paths,omitempty"` + SubscribeOptions *SubscribeOptions `protobuf:"bytes,6,opt,name=subscribe_options,json=subscribeOptions,proto3" json:"subscribe_options,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Subscription) Reset() { @@ -109,11 +109,10 @@ func (x *Subscription) GetSubscribeOptions() *SubscribeOptions { } type Path struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Elem []string `protobuf:"bytes,1,rep,name=elem,proto3" json:"elem,omitempty"` unknownFields protoimpl.UnknownFields - - Elem []string `protobuf:"bytes,1,rep,name=elem,proto3" json:"elem,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Path) Reset() { @@ -154,13 +153,12 @@ func (x *Path) GetElem() []string { } type SubscribeOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - GnmiMode string `protobuf:"bytes,1,opt,name=gnmi_mode,json=gnmiMode,proto3" json:"gnmi_mode,omitempty"` - GnmiStreamMode string `protobuf:"bytes,2,opt,name=gnmi_stream_mode,json=gnmiStreamMode,proto3" json:"gnmi_stream_mode,omitempty"` - SampleInterval uint64 `protobuf:"varint,3,opt,name=sample_interval,json=sampleInterval,proto3" json:"sample_interval,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + GnmiMode string `protobuf:"bytes,1,opt,name=gnmi_mode,json=gnmiMode,proto3" json:"gnmi_mode,omitempty"` + GnmiStreamMode string `protobuf:"bytes,2,opt,name=gnmi_stream_mode,json=gnmiStreamMode,proto3" json:"gnmi_stream_mode,omitempty"` + SampleInterval uint64 `protobuf:"varint,3,opt,name=sample_interval,json=sampleInterval,proto3" json:"sample_interval,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SubscribeOptions) Reset() { @@ -215,11 +213,10 @@ func (x *SubscribeOptions) GetSampleInterval() uint64 { } type GetAllRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetAllRequest) Reset() { @@ -260,12 +257,11 @@ func (x *GetAllRequest) GetTimestamp() int64 { } type GetAllResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Subscriptions []*Subscription `protobuf:"bytes,2,rep,name=subscriptions,proto3" json:"subscriptions,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Subscriptions []*Subscription `protobuf:"bytes,2,rep,name=subscriptions,proto3" json:"subscriptions,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetAllResponse) Reset() { @@ -313,12 +309,11 @@ func (x *GetAllResponse) GetSubscriptions() []*Subscription { } type GetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Subid string `protobuf:"bytes,2,opt,name=subid,proto3" json:"subid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Subid string `protobuf:"bytes,2,opt,name=subid,proto3" json:"subid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRequest) Reset() { @@ -366,12 +361,11 @@ func (x *GetRequest) GetSubid() string { } type GetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Subscriptions *Subscription `protobuf:"bytes,2,opt,name=subscriptions,proto3" json:"subscriptions,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Subscriptions *Subscription `protobuf:"bytes,2,opt,name=subscriptions,proto3" json:"subscriptions,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetResponse) Reset() { @@ -419,12 +413,11 @@ func (x *GetResponse) GetSubscriptions() *Subscription { } type DeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Subid string `protobuf:"bytes,2,opt,name=subid,proto3" json:"subid,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Subid string `protobuf:"bytes,2,opt,name=subid,proto3" json:"subid,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRequest) Reset() { @@ -472,11 +465,10 @@ func (x *DeleteRequest) GetSubid() string { } type DeleteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteResponse) Reset() { @@ -517,13 +509,12 @@ func (x *DeleteResponse) GetTimestamp() int64 { } type AddRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` + Subscription *Subscription `protobuf:"bytes,3,opt,name=subscription,proto3" json:"subscription,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` - Subscription *Subscription `protobuf:"bytes,3,opt,name=subscription,proto3" json:"subscription,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddRequest) Reset() { @@ -578,11 +569,10 @@ func (x *AddRequest) GetSubscription() *Subscription { } type AddResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddResponse) Reset() { @@ -623,11 +613,10 @@ func (x *AddResponse) GetTimestamp() int64 { } type ResetAllSubscriptionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ResetAllSubscriptionsRequest) Reset() { @@ -668,11 +657,10 @@ func (x *ResetAllSubscriptionsRequest) GetTimestamp() int64 { } type ResetAllSubscriptionsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ResetAllSubscriptionsResponse) Reset() { @@ -714,7 +702,7 @@ func (x *ResetAllSubscriptionsResponse) GetTimestamp() int64 { var File_gosdn_subscriptionmanagement_subscriptionmanagement_proto protoreflect.FileDescriptor -var file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc = []byte{ +var file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc = string([]byte{ 0x0a, 0x39, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, @@ -855,16 +843,16 @@ var file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc = []b 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x75, 0x62, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescOnce sync.Once - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescData = file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc + file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescData []byte ) func file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescGZIP() []byte { file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescOnce.Do(func() { - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescData) + file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc), len(file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc))) }) return file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDescData } @@ -917,7 +905,7 @@ func file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc), len(file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc)), NumEnums: 0, NumMessages: 13, NumExtensions: 0, @@ -928,7 +916,6 @@ func file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_init() { MessageInfos: file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_msgTypes, }.Build() File_gosdn_subscriptionmanagement_subscriptionmanagement_proto = out.File - file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_rawDesc = nil file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_goTypes = nil file_gosdn_subscriptionmanagement_subscriptionmanagement_proto_depIdxs = nil } diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go index b7efc5dc0..40aebfa6e 100755 --- a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go +++ b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go @@ -10,6 +10,7 @@ package submanagement import ( "context" + "errors" "io" "net/http" @@ -24,283 +25,220 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join - var ( - filter_SubscriptionManagementService_GetAll_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join ) -func request_SubscriptionManagementService_GetAll_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAllRequest - var metadata runtime.ServerMetadata +var filter_SubscriptionManagementService_GetAll_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +func request_SubscriptionManagementService_GetAll_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq GetAllRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_GetAll_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetAll(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_SubscriptionManagementService_GetAll_0(ctx context.Context, marshaler runtime.Marshaler, server SubscriptionManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAllRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetAllRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_GetAll_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetAll(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_SubscriptionManagementService_Get_0 = &utilities.DoubleArray{Encoding: map[string]int{"subid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_SubscriptionManagementService_Get_0 = &utilities.DoubleArray{Encoding: map[string]int{"subid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_SubscriptionManagementService_Get_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["subid"] + val, ok := pathParams["subid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "subid") } - protoReq.Subid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "subid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_Get_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Get(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_SubscriptionManagementService_Get_0(ctx context.Context, marshaler runtime.Marshaler, server SubscriptionManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq GetRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["subid"] + val, ok := pathParams["subid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "subid") } - protoReq.Subid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "subid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_Get_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Get(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_SubscriptionManagementService_Delete_0 = &utilities.DoubleArray{Encoding: map[string]int{"subid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) +var filter_SubscriptionManagementService_Delete_0 = &utilities.DoubleArray{Encoding: map[string]int{"subid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} func request_SubscriptionManagementService_Delete_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["subid"] + val, ok := pathParams["subid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "subid") } - protoReq.Subid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "subid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_Delete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Delete(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_SubscriptionManagementService_Delete_0(ctx context.Context, marshaler runtime.Marshaler, server SubscriptionManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRequest - var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err + protoReq DeleteRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["subid"] + val, ok := pathParams["subid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "subid") } - protoReq.Subid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "subid", err) } - if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_Delete_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.Delete(ctx, &protoReq) return msg, metadata, err - } func request_SubscriptionManagementService_Add_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq AddRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - msg, err := client.Add(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_SubscriptionManagementService_Add_0(ctx context.Context, marshaler runtime.Marshaler, server SubscriptionManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( - val string - ok bool - err error - _ = err + protoReq AddRequest + metadata runtime.ServerMetadata + err error ) - - val, ok = pathParams["mneid"] + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") } - protoReq.Mneid, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "mneid", err) } - msg, err := server.Add(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_SubscriptionManagementService_ResetAllSubscriptions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_SubscriptionManagementService_ResetAllSubscriptions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_SubscriptionManagementService_ResetAllSubscriptions_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResetAllSubscriptionsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ResetAllSubscriptionsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_ResetAllSubscriptions_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ResetAllSubscriptions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_SubscriptionManagementService_ResetAllSubscriptions_0(ctx context.Context, marshaler runtime.Marshaler, server SubscriptionManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ResetAllSubscriptionsRequest - var metadata runtime.ServerMetadata - + var ( + protoReq ResetAllSubscriptionsRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SubscriptionManagementService_ResetAllSubscriptions_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ResetAllSubscriptions(ctx, &protoReq) return msg, metadata, err - } // RegisterSubscriptionManagementServiceHandlerServer registers the http handlers for service SubscriptionManagementService to "mux". @@ -309,16 +247,13 @@ func local_request_SubscriptionManagementService_ResetAllSubscriptions_0(ctx con // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterSubscriptionManagementServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterSubscriptionManagementServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SubscriptionManagementServiceServer) error { - - mux.Handle("GET", pattern_SubscriptionManagementService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_SubscriptionManagementService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/GetAll", runtime.WithHTTPPathPattern("/submanagement/subscriptions")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/GetAll", runtime.WithHTTPPathPattern("/submanagement/subscriptions")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -330,20 +265,15 @@ func RegisterSubscriptionManagementServiceHandlerServer(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_GetAll_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_SubscriptionManagementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_SubscriptionManagementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Get", runtime.WithHTTPPathPattern("/submanagement/{subid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Get", runtime.WithHTTPPathPattern("/submanagement/{subid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -355,20 +285,15 @@ func RegisterSubscriptionManagementServiceHandlerServer(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_SubscriptionManagementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_SubscriptionManagementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Delete", runtime.WithHTTPPathPattern("/submanagement/{subid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Delete", runtime.WithHTTPPathPattern("/submanagement/{subid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -380,20 +305,15 @@ func RegisterSubscriptionManagementServiceHandlerServer(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_Delete_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_SubscriptionManagementService_Add_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_SubscriptionManagementService_Add_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Add", runtime.WithHTTPPathPattern("/submanagement/{mneid}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Add", runtime.WithHTTPPathPattern("/submanagement/{mneid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -405,20 +325,15 @@ func RegisterSubscriptionManagementServiceHandlerServer(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_Add_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_SubscriptionManagementService_ResetAllSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_SubscriptionManagementService_ResetAllSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/ResetAllSubscriptions", runtime.WithHTTPPathPattern("/submanagement/reset")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/ResetAllSubscriptions", runtime.WithHTTPPathPattern("/submanagement/reset")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -430,9 +345,7 @@ func RegisterSubscriptionManagementServiceHandlerServer(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_ResetAllSubscriptions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -459,7 +372,6 @@ func RegisterSubscriptionManagementServiceHandlerFromEndpoint(ctx context.Contex } }() }() - return RegisterSubscriptionManagementServiceHandler(ctx, mux, conn) } @@ -475,14 +387,11 @@ func RegisterSubscriptionManagementServiceHandler(ctx context.Context, mux *runt // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "SubscriptionManagementServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterSubscriptionManagementServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SubscriptionManagementServiceClient) error { - - mux.Handle("GET", pattern_SubscriptionManagementService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_SubscriptionManagementService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/GetAll", runtime.WithHTTPPathPattern("/submanagement/subscriptions")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/GetAll", runtime.WithHTTPPathPattern("/submanagement/subscriptions")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -493,18 +402,13 @@ func RegisterSubscriptionManagementServiceHandlerClient(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_GetAll_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_SubscriptionManagementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_SubscriptionManagementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Get", runtime.WithHTTPPathPattern("/submanagement/{subid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Get", runtime.WithHTTPPathPattern("/submanagement/{subid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -515,18 +419,13 @@ func RegisterSubscriptionManagementServiceHandlerClient(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_SubscriptionManagementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_SubscriptionManagementService_Delete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Delete", runtime.WithHTTPPathPattern("/submanagement/{subid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Delete", runtime.WithHTTPPathPattern("/submanagement/{subid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -537,18 +436,13 @@ func RegisterSubscriptionManagementServiceHandlerClient(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_Delete_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_SubscriptionManagementService_Add_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_SubscriptionManagementService_Add_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Add", runtime.WithHTTPPathPattern("/submanagement/{mneid}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/Add", runtime.WithHTTPPathPattern("/submanagement/{mneid}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -559,18 +453,13 @@ func RegisterSubscriptionManagementServiceHandlerClient(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_Add_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_SubscriptionManagementService_ResetAllSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_SubscriptionManagementService_ResetAllSubscriptions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/ResetAllSubscriptions", runtime.WithHTTPPathPattern("/submanagement/reset")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.subscriptionmanagement.SubscriptionManagementService/ResetAllSubscriptions", runtime.WithHTTPPathPattern("/submanagement/reset")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -581,34 +470,23 @@ func RegisterSubscriptionManagementServiceHandlerClient(ctx context.Context, mux runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_SubscriptionManagementService_ResetAllSubscriptions_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_SubscriptionManagementService_GetAll_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"submanagement", "subscriptions"}, "")) - - pattern_SubscriptionManagementService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"submanagement", "subid"}, "")) - - pattern_SubscriptionManagementService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"submanagement", "subid"}, "")) - - pattern_SubscriptionManagementService_Add_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"submanagement", "mneid"}, "")) - + pattern_SubscriptionManagementService_GetAll_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"submanagement", "subscriptions"}, "")) + pattern_SubscriptionManagementService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"submanagement", "subid"}, "")) + pattern_SubscriptionManagementService_Delete_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"submanagement", "subid"}, "")) + pattern_SubscriptionManagementService_Add_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"submanagement", "mneid"}, "")) pattern_SubscriptionManagementService_ResetAllSubscriptions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"submanagement", "reset"}, "")) ) var ( - forward_SubscriptionManagementService_GetAll_0 = runtime.ForwardResponseMessage - - forward_SubscriptionManagementService_Get_0 = runtime.ForwardResponseMessage - - forward_SubscriptionManagementService_Delete_0 = runtime.ForwardResponseMessage - - forward_SubscriptionManagementService_Add_0 = runtime.ForwardResponseMessage - + forward_SubscriptionManagementService_GetAll_0 = runtime.ForwardResponseMessage + forward_SubscriptionManagementService_Get_0 = runtime.ForwardResponseMessage + forward_SubscriptionManagementService_Delete_0 = runtime.ForwardResponseMessage + forward_SubscriptionManagementService_Add_0 = runtime.ForwardResponseMessage forward_SubscriptionManagementService_ResetAllSubscriptions_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/topology/link.pb.go b/api/go/gosdn/topology/link.pb.go index 398feb9d9..d18acbd1b 100755 --- a/api/go/gosdn/topology/link.pb.go +++ b/api/go/gosdn/topology/link.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/topology/link.proto @@ -16,6 +16,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -26,17 +27,16 @@ const ( ) type Link struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + SourceNode *Node `protobuf:"bytes,3,opt,name=sourceNode,proto3" json:"sourceNode,omitempty"` + TargetNode *Node `protobuf:"bytes,4,opt,name=targetNode,proto3" json:"targetNode,omitempty"` + SourcePort *Port `protobuf:"bytes,5,opt,name=sourcePort,proto3" json:"sourcePort,omitempty"` + TargetPort *Port `protobuf:"bytes,6,opt,name=targetPort,proto3" json:"targetPort,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,7,opt,name=metadata,proto3" json:"metadata,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - SourceNode *Node `protobuf:"bytes,3,opt,name=sourceNode,proto3" json:"sourceNode,omitempty"` - TargetNode *Node `protobuf:"bytes,4,opt,name=targetNode,proto3" json:"targetNode,omitempty"` - SourcePort *Port `protobuf:"bytes,5,opt,name=sourcePort,proto3" json:"sourcePort,omitempty"` - TargetPort *Port `protobuf:"bytes,6,opt,name=targetPort,proto3" json:"targetPort,omitempty"` - Metadata *conflict.Metadata `protobuf:"bytes,7,opt,name=metadata,proto3" json:"metadata,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Link) Reset() { @@ -120,7 +120,7 @@ func (x *Link) GetMetadata() *conflict.Metadata { var File_gosdn_topology_link_proto protoreflect.FileDescriptor -var file_gosdn_topology_link_proto_rawDesc = []byte{ +var file_gosdn_topology_link_proto_rawDesc = string([]byte{ 0x0a, 0x19, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, @@ -164,16 +164,16 @@ var file_gosdn_topology_link_proto_rawDesc = []byte{ 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_topology_link_proto_rawDescOnce sync.Once - file_gosdn_topology_link_proto_rawDescData = file_gosdn_topology_link_proto_rawDesc + file_gosdn_topology_link_proto_rawDescData []byte ) func file_gosdn_topology_link_proto_rawDescGZIP() []byte { file_gosdn_topology_link_proto_rawDescOnce.Do(func() { - file_gosdn_topology_link_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_topology_link_proto_rawDescData) + file_gosdn_topology_link_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_topology_link_proto_rawDesc), len(file_gosdn_topology_link_proto_rawDesc))) }) return file_gosdn_topology_link_proto_rawDescData } @@ -209,7 +209,7 @@ func file_gosdn_topology_link_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_topology_link_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_topology_link_proto_rawDesc), len(file_gosdn_topology_link_proto_rawDesc)), NumEnums: 0, NumMessages: 1, NumExtensions: 0, @@ -220,7 +220,6 @@ func file_gosdn_topology_link_proto_init() { MessageInfos: file_gosdn_topology_link_proto_msgTypes, }.Build() File_gosdn_topology_link_proto = out.File - file_gosdn_topology_link_proto_rawDesc = nil file_gosdn_topology_link_proto_goTypes = nil file_gosdn_topology_link_proto_depIdxs = nil } diff --git a/api/go/gosdn/topology/node.pb.go b/api/go/gosdn/topology/node.pb.go index b65392c17..d9c0e5af1 100755 --- a/api/go/gosdn/topology/node.pb.go +++ b/api/go/gosdn/topology/node.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/topology/node.proto @@ -16,6 +16,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -26,13 +27,12 @@ const ( ) type Node struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Metadata *conflict.Metadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Node) Reset() { @@ -88,7 +88,7 @@ func (x *Node) GetMetadata() *conflict.Metadata { var File_gosdn_topology_node_proto protoreflect.FileDescriptor -var file_gosdn_topology_node_proto_rawDesc = []byte{ +var file_gosdn_topology_node_proto_rawDesc = string([]byte{ 0x0a, 0x19, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, @@ -113,16 +113,16 @@ var file_gosdn_topology_node_proto_rawDesc = []byte{ 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_topology_node_proto_rawDescOnce sync.Once - file_gosdn_topology_node_proto_rawDescData = file_gosdn_topology_node_proto_rawDesc + file_gosdn_topology_node_proto_rawDescData []byte ) func file_gosdn_topology_node_proto_rawDescGZIP() []byte { file_gosdn_topology_node_proto_rawDescOnce.Do(func() { - file_gosdn_topology_node_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_topology_node_proto_rawDescData) + file_gosdn_topology_node_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_topology_node_proto_rawDesc), len(file_gosdn_topology_node_proto_rawDesc))) }) return file_gosdn_topology_node_proto_rawDescData } @@ -150,7 +150,7 @@ func file_gosdn_topology_node_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_topology_node_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_topology_node_proto_rawDesc), len(file_gosdn_topology_node_proto_rawDesc)), NumEnums: 0, NumMessages: 1, NumExtensions: 0, @@ -161,7 +161,6 @@ func file_gosdn_topology_node_proto_init() { MessageInfos: file_gosdn_topology_node_proto_msgTypes, }.Build() File_gosdn_topology_node_proto = out.File - file_gosdn_topology_node_proto_rawDesc = nil file_gosdn_topology_node_proto_goTypes = nil file_gosdn_topology_node_proto_depIdxs = nil } diff --git a/api/go/gosdn/topology/port.pb.go b/api/go/gosdn/topology/port.pb.go index de83b8af4..383452572 100755 --- a/api/go/gosdn/topology/port.pb.go +++ b/api/go/gosdn/topology/port.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/topology/port.proto @@ -16,6 +16,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -26,12 +27,11 @@ const ( ) type Configuration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` + PrefixLength int64 `protobuf:"varint,2,opt,name=prefixLength,proto3" json:"prefixLength,omitempty"` unknownFields protoimpl.UnknownFields - - Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` - PrefixLength int64 `protobuf:"varint,2,opt,name=prefixLength,proto3" json:"prefixLength,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Configuration) Reset() { @@ -79,14 +79,13 @@ func (x *Configuration) GetPrefixLength() int64 { } type Port struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Configuration *Configuration `protobuf:"bytes,3,opt,name=configuration,proto3" json:"configuration,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Configuration *Configuration `protobuf:"bytes,3,opt,name=configuration,proto3" json:"configuration,omitempty"` - Metadata *conflict.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Port) Reset() { @@ -149,7 +148,7 @@ func (x *Port) GetMetadata() *conflict.Metadata { var File_gosdn_topology_port_proto protoreflect.FileDescriptor -var file_gosdn_topology_port_proto_rawDesc = []byte{ +var file_gosdn_topology_port_proto_rawDesc = string([]byte{ 0x0a, 0x19, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, @@ -185,16 +184,16 @@ var file_gosdn_topology_port_proto_rawDesc = []byte{ 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_topology_port_proto_rawDescOnce sync.Once - file_gosdn_topology_port_proto_rawDescData = file_gosdn_topology_port_proto_rawDesc + file_gosdn_topology_port_proto_rawDescData []byte ) func file_gosdn_topology_port_proto_rawDescGZIP() []byte { file_gosdn_topology_port_proto_rawDescOnce.Do(func() { - file_gosdn_topology_port_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_topology_port_proto_rawDescData) + file_gosdn_topology_port_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_topology_port_proto_rawDesc), len(file_gosdn_topology_port_proto_rawDesc))) }) return file_gosdn_topology_port_proto_rawDescData } @@ -224,7 +223,7 @@ func file_gosdn_topology_port_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_topology_port_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_topology_port_proto_rawDesc), len(file_gosdn_topology_port_proto_rawDesc)), NumEnums: 0, NumMessages: 2, NumExtensions: 0, @@ -235,7 +234,6 @@ func file_gosdn_topology_port_proto_init() { MessageInfos: file_gosdn_topology_port_proto_msgTypes, }.Build() File_gosdn_topology_port_proto = out.File - file_gosdn_topology_port_proto_rawDesc = nil file_gosdn_topology_port_proto_goTypes = nil file_gosdn_topology_port_proto_depIdxs = nil } diff --git a/api/go/gosdn/topology/route.pb.go b/api/go/gosdn/topology/route.pb.go index 9627c2df6..f4472000e 100755 --- a/api/go/gosdn/topology/route.pb.go +++ b/api/go/gosdn/topology/route.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/topology/route.proto @@ -16,6 +16,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -26,15 +27,14 @@ const ( ) type Route struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TargetIPRange string `protobuf:"bytes,2,opt,name=targetIPRange,proto3" json:"targetIPRange,omitempty"` + NextHopIP string `protobuf:"bytes,3,opt,name=nextHopIP,proto3" json:"nextHopIP,omitempty"` + PortID string `protobuf:"bytes,4,opt,name=portID,proto3" json:"portID,omitempty"` + Metric string `protobuf:"bytes,5,opt,name=metric,proto3" json:"metric,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - TargetIPRange string `protobuf:"bytes,2,opt,name=targetIPRange,proto3" json:"targetIPRange,omitempty"` - NextHopIP string `protobuf:"bytes,3,opt,name=nextHopIP,proto3" json:"nextHopIP,omitempty"` - PortID string `protobuf:"bytes,4,opt,name=portID,proto3" json:"portID,omitempty"` - Metric string `protobuf:"bytes,5,opt,name=metric,proto3" json:"metric,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Route) Reset() { @@ -103,14 +103,13 @@ func (x *Route) GetMetric() string { } type RoutingTable struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + NodeID string `protobuf:"bytes,2,opt,name=nodeID,proto3" json:"nodeID,omitempty"` + Routes []*Route `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - NodeID string `protobuf:"bytes,2,opt,name=nodeID,proto3" json:"nodeID,omitempty"` - Routes []*Route `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` - Metadata *conflict.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RoutingTable) Reset() { @@ -173,7 +172,7 @@ func (x *RoutingTable) GetMetadata() *conflict.Metadata { var File_gosdn_topology_route_proto protoreflect.FileDescriptor -var file_gosdn_topology_route_proto_rawDesc = []byte{ +var file_gosdn_topology_route_proto_rawDesc = string([]byte{ 0x0a, 0x1a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, 0x1c, 0x67, 0x6f, @@ -213,16 +212,16 @@ var file_gosdn_topology_route_proto_rawDesc = []byte{ 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_topology_route_proto_rawDescOnce sync.Once - file_gosdn_topology_route_proto_rawDescData = file_gosdn_topology_route_proto_rawDesc + file_gosdn_topology_route_proto_rawDescData []byte ) func file_gosdn_topology_route_proto_rawDescGZIP() []byte { file_gosdn_topology_route_proto_rawDescOnce.Do(func() { - file_gosdn_topology_route_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_topology_route_proto_rawDescData) + file_gosdn_topology_route_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_topology_route_proto_rawDesc), len(file_gosdn_topology_route_proto_rawDesc))) }) return file_gosdn_topology_route_proto_rawDescData } @@ -252,7 +251,7 @@ func file_gosdn_topology_route_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_topology_route_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_topology_route_proto_rawDesc), len(file_gosdn_topology_route_proto_rawDesc)), NumEnums: 0, NumMessages: 2, NumExtensions: 0, @@ -263,7 +262,6 @@ func file_gosdn_topology_route_proto_init() { MessageInfos: file_gosdn_topology_route_proto_msgTypes, }.Build() File_gosdn_topology_route_proto = out.File - file_gosdn_topology_route_proto_rawDesc = nil file_gosdn_topology_route_proto_goTypes = nil file_gosdn_topology_route_proto_depIdxs = nil } diff --git a/api/go/gosdn/topology/routingTable.pb.go b/api/go/gosdn/topology/routingTable.pb.go index 1b9638cb3..d7b791f34 100755 --- a/api/go/gosdn/topology/routingTable.pb.go +++ b/api/go/gosdn/topology/routingTable.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/topology/routingTable.proto @@ -16,6 +16,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -26,12 +27,11 @@ const ( ) type AddRoutingTableRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RoutingTable *RoutingTable `protobuf:"bytes,2,opt,name=routingTable,proto3" json:"routingTable,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RoutingTable *RoutingTable `protobuf:"bytes,2,opt,name=routingTable,proto3" json:"routingTable,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddRoutingTableRequest) Reset() { @@ -79,11 +79,10 @@ func (x *AddRoutingTableRequest) GetRoutingTable() *RoutingTable { } type AddRoutingTableResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddRoutingTableResponse) Reset() { @@ -124,11 +123,10 @@ func (x *AddRoutingTableResponse) GetTimestamp() int64 { } type GetRoutesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRoutesRequest) Reset() { @@ -169,12 +167,11 @@ func (x *GetRoutesRequest) GetTimestamp() int64 { } type GetRoutesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RoutingTables []*RoutingTable `protobuf:"bytes,2,rep,name=routingTables,proto3" json:"routingTables,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RoutingTables []*RoutingTable `protobuf:"bytes,2,rep,name=routingTables,proto3" json:"routingTables,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRoutesResponse) Reset() { @@ -222,12 +219,11 @@ func (x *GetRoutesResponse) GetRoutingTables() []*RoutingTable { } type DeleteRoutesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRoutesRequest) Reset() { @@ -275,11 +271,10 @@ func (x *DeleteRoutesRequest) GetId() string { } type DeleteRoutesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRoutesResponse) Reset() { @@ -321,7 +316,7 @@ func (x *DeleteRoutesResponse) GetTimestamp() int64 { var File_gosdn_topology_routingTable_proto protoreflect.FileDescriptor -var file_gosdn_topology_routingTable_proto_rawDesc = []byte{ +var file_gosdn_topology_routingTable_proto_rawDesc = string([]byte{ 0x0a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x6c, @@ -397,16 +392,16 @@ var file_gosdn_topology_routingTable_proto_rawDesc = []byte{ 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_topology_routingTable_proto_rawDescOnce sync.Once - file_gosdn_topology_routingTable_proto_rawDescData = file_gosdn_topology_routingTable_proto_rawDesc + file_gosdn_topology_routingTable_proto_rawDescData []byte ) func file_gosdn_topology_routingTable_proto_rawDescGZIP() []byte { file_gosdn_topology_routingTable_proto_rawDescOnce.Do(func() { - file_gosdn_topology_routingTable_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_topology_routingTable_proto_rawDescData) + file_gosdn_topology_routingTable_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_topology_routingTable_proto_rawDesc), len(file_gosdn_topology_routingTable_proto_rawDesc))) }) return file_gosdn_topology_routingTable_proto_rawDescData } @@ -448,7 +443,7 @@ func file_gosdn_topology_routingTable_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_topology_routingTable_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_topology_routingTable_proto_rawDesc), len(file_gosdn_topology_routingTable_proto_rawDesc)), NumEnums: 0, NumMessages: 6, NumExtensions: 0, @@ -459,7 +454,6 @@ func file_gosdn_topology_routingTable_proto_init() { MessageInfos: file_gosdn_topology_routingTable_proto_msgTypes, }.Build() File_gosdn_topology_routingTable_proto = out.File - file_gosdn_topology_routingTable_proto_rawDesc = nil file_gosdn_topology_routingTable_proto_goTypes = nil file_gosdn_topology_routingTable_proto_depIdxs = nil } diff --git a/api/go/gosdn/topology/routingTable.pb.gw.go b/api/go/gosdn/topology/routingTable.pb.gw.go index 2b736a2f5..4bcd1b743 100755 --- a/api/go/gosdn/topology/routingTable.pb.gw.go +++ b/api/go/gosdn/topology/routingTable.pb.gw.go @@ -10,6 +10,7 @@ package topology import ( "context" + "errors" "io" "net/http" @@ -24,109 +25,102 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_RoutingTableService_AddRoutingTable_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingTableServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddRoutingTableRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddRoutingTableRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AddRoutingTable(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoutingTableService_AddRoutingTable_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingTableServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddRoutingTableRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddRoutingTableRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AddRoutingTable(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RoutingTableService_GetRoutes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RoutingTableService_GetRoutes_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RoutingTableService_GetRoutes_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingTableServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRoutesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetRoutesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingTableService_GetRoutes_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetRoutes(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoutingTableService_GetRoutes_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingTableServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetRoutesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetRoutesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingTableService_GetRoutes_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetRoutes(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_RoutingTableService_DeleteRoute_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_RoutingTableService_DeleteRoute_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_RoutingTableService_DeleteRoute_0(ctx context.Context, marshaler runtime.Marshaler, client RoutingTableServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRoutesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteRoutesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingTableService_DeleteRoute_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteRoute(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_RoutingTableService_DeleteRoute_0(ctx context.Context, marshaler runtime.Marshaler, server RoutingTableServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteRoutesRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteRoutesRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoutingTableService_DeleteRoute_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteRoute(ctx, &protoReq) return msg, metadata, err - } // RegisterRoutingTableServiceHandlerServer registers the http handlers for service RoutingTableService to "mux". @@ -135,16 +129,13 @@ func local_request_RoutingTableService_DeleteRoute_0(ctx context.Context, marsha // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterRoutingTableServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterRoutingTableServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RoutingTableServiceServer) error { - - mux.Handle("POST", pattern_RoutingTableService_AddRoutingTable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RoutingTableService_AddRoutingTable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/AddRoutingTable", runtime.WithHTTPPathPattern("/routing/create")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/AddRoutingTable", runtime.WithHTTPPathPattern("/routing/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -156,20 +147,15 @@ func RegisterRoutingTableServiceHandlerServer(ctx context.Context, mux *runtime. runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoutingTableService_AddRoutingTable_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RoutingTableService_GetRoutes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RoutingTableService_GetRoutes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/GetRoutes", runtime.WithHTTPPathPattern("/routing")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/GetRoutes", runtime.WithHTTPPathPattern("/routing")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -181,20 +167,15 @@ func RegisterRoutingTableServiceHandlerServer(ctx context.Context, mux *runtime. runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoutingTableService_GetRoutes_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RoutingTableService_DeleteRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RoutingTableService_DeleteRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/DeleteRoute", runtime.WithHTTPPathPattern("/routing/delete")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/DeleteRoute", runtime.WithHTTPPathPattern("/routing/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -206,9 +187,7 @@ func RegisterRoutingTableServiceHandlerServer(ctx context.Context, mux *runtime. runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoutingTableService_DeleteRoute_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -235,7 +214,6 @@ func RegisterRoutingTableServiceHandlerFromEndpoint(ctx context.Context, mux *ru } }() }() - return RegisterRoutingTableServiceHandler(ctx, mux, conn) } @@ -251,14 +229,11 @@ func RegisterRoutingTableServiceHandler(ctx context.Context, mux *runtime.ServeM // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "RoutingTableServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterRoutingTableServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RoutingTableServiceClient) error { - - mux.Handle("POST", pattern_RoutingTableService_AddRoutingTable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_RoutingTableService_AddRoutingTable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/AddRoutingTable", runtime.WithHTTPPathPattern("/routing/create")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/AddRoutingTable", runtime.WithHTTPPathPattern("/routing/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -269,18 +244,13 @@ func RegisterRoutingTableServiceHandlerClient(ctx context.Context, mux *runtime. runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoutingTableService_AddRoutingTable_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_RoutingTableService_GetRoutes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_RoutingTableService_GetRoutes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/GetRoutes", runtime.WithHTTPPathPattern("/routing")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/GetRoutes", runtime.WithHTTPPathPattern("/routing")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -291,18 +261,13 @@ func RegisterRoutingTableServiceHandlerClient(ctx context.Context, mux *runtime. runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoutingTableService_GetRoutes_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_RoutingTableService_DeleteRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_RoutingTableService_DeleteRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/DeleteRoute", runtime.WithHTTPPathPattern("/routing/delete")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.RoutingTableService/DeleteRoute", runtime.WithHTTPPathPattern("/routing/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -313,26 +278,19 @@ func RegisterRoutingTableServiceHandlerClient(ctx context.Context, mux *runtime. runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_RoutingTableService_DeleteRoute_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( pattern_RoutingTableService_AddRoutingTable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"routing", "create"}, "")) - - pattern_RoutingTableService_GetRoutes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"routing"}, "")) - - pattern_RoutingTableService_DeleteRoute_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"routing", "delete"}, "")) + pattern_RoutingTableService_GetRoutes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"routing"}, "")) + pattern_RoutingTableService_DeleteRoute_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"routing", "delete"}, "")) ) var ( forward_RoutingTableService_AddRoutingTable_0 = runtime.ForwardResponseMessage - - forward_RoutingTableService_GetRoutes_0 = runtime.ForwardResponseMessage - - forward_RoutingTableService_DeleteRoute_0 = runtime.ForwardResponseMessage + forward_RoutingTableService_GetRoutes_0 = runtime.ForwardResponseMessage + forward_RoutingTableService_DeleteRoute_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/topology/topology.pb.go b/api/go/gosdn/topology/topology.pb.go index 6d85ea4ad..073a288f8 100755 --- a/api/go/gosdn/topology/topology.pb.go +++ b/api/go/gosdn/topology/topology.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/topology/topology.proto @@ -15,6 +15,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -25,11 +26,10 @@ const ( ) type Topology struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Links []*Link `protobuf:"bytes,1,rep,name=links,proto3" json:"links,omitempty"` unknownFields protoimpl.UnknownFields - - Links []*Link `protobuf:"bytes,1,rep,name=links,proto3" json:"links,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Topology) Reset() { @@ -70,12 +70,11 @@ func (x *Topology) GetLinks() []*Link { } type AddLinkRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Link *Link `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Link *Link `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddLinkRequest) Reset() { @@ -123,11 +122,10 @@ func (x *AddLinkRequest) GetLink() *Link { } type AddLinkResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddLinkResponse) Reset() { @@ -168,11 +166,10 @@ func (x *AddLinkResponse) GetTimestamp() int64 { } type GetTopologyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetTopologyRequest) Reset() { @@ -213,12 +210,11 @@ func (x *GetTopologyRequest) GetTimestamp() int64 { } type GetTopologyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Toplogy *Topology `protobuf:"bytes,2,opt,name=toplogy,proto3" json:"toplogy,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Toplogy *Topology `protobuf:"bytes,2,opt,name=toplogy,proto3" json:"toplogy,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetTopologyResponse) Reset() { @@ -266,12 +262,11 @@ func (x *GetTopologyResponse) GetToplogy() *Topology { } type UpdateLinkRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Link *Link `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Link *Link `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateLinkRequest) Reset() { @@ -319,11 +314,10 @@ func (x *UpdateLinkRequest) GetLink() *Link { } type UpdateLinkResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateLinkResponse) Reset() { @@ -364,12 +358,11 @@ func (x *UpdateLinkResponse) GetTimestamp() int64 { } type DeleteLinkRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteLinkRequest) Reset() { @@ -417,11 +410,10 @@ func (x *DeleteLinkRequest) GetId() string { } type DeleteLinkResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteLinkResponse) Reset() { @@ -463,7 +455,7 @@ func (x *DeleteLinkResponse) GetTimestamp() int64 { var File_gosdn_topology_topology_proto protoreflect.FileDescriptor -var file_gosdn_topology_topology_proto_rawDesc = []byte{ +var file_gosdn_topology_topology_proto_rawDesc = string([]byte{ 0x0a, 0x1d, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, @@ -552,16 +544,16 @@ var file_gosdn_topology_topology_proto_rawDesc = []byte{ 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_topology_topology_proto_rawDescOnce sync.Once - file_gosdn_topology_topology_proto_rawDescData = file_gosdn_topology_topology_proto_rawDesc + file_gosdn_topology_topology_proto_rawDescData []byte ) func file_gosdn_topology_topology_proto_rawDescGZIP() []byte { file_gosdn_topology_topology_proto_rawDescOnce.Do(func() { - file_gosdn_topology_topology_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_topology_topology_proto_rawDescData) + file_gosdn_topology_topology_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_topology_topology_proto_rawDesc), len(file_gosdn_topology_topology_proto_rawDesc))) }) return file_gosdn_topology_topology_proto_rawDescData } @@ -610,7 +602,7 @@ func file_gosdn_topology_topology_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_topology_topology_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_topology_topology_proto_rawDesc), len(file_gosdn_topology_topology_proto_rawDesc)), NumEnums: 0, NumMessages: 9, NumExtensions: 0, @@ -621,7 +613,6 @@ func file_gosdn_topology_topology_proto_init() { MessageInfos: file_gosdn_topology_topology_proto_msgTypes, }.Build() File_gosdn_topology_topology_proto = out.File - file_gosdn_topology_topology_proto_rawDesc = nil file_gosdn_topology_topology_proto_goTypes = nil file_gosdn_topology_topology_proto_depIdxs = nil } diff --git a/api/go/gosdn/topology/topology.pb.gw.go b/api/go/gosdn/topology/topology.pb.gw.go index 93edbd2fd..d4587d504 100755 --- a/api/go/gosdn/topology/topology.pb.gw.go +++ b/api/go/gosdn/topology/topology.pb.gw.go @@ -10,6 +10,7 @@ package topology import ( "context" + "errors" "io" "net/http" @@ -24,135 +25,126 @@ import ( ) // Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join +var ( + _ codes.Code + _ io.Reader + _ status.Status + _ = errors.New + _ = runtime.String + _ = utilities.NewDoubleArray + _ = metadata.Join +) func request_TopologyService_AddLink_0(ctx context.Context, marshaler runtime.Marshaler, client TopologyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddLinkRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddLinkRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.AddLink(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_TopologyService_AddLink_0(ctx context.Context, marshaler runtime.Marshaler, server TopologyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq AddLinkRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq AddLinkRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.AddLink(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_TopologyService_GetTopology_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_TopologyService_GetTopology_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_TopologyService_GetTopology_0(ctx context.Context, marshaler runtime.Marshaler, client TopologyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetTopologyRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetTopologyRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TopologyService_GetTopology_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetTopology(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_TopologyService_GetTopology_0(ctx context.Context, marshaler runtime.Marshaler, server TopologyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetTopologyRequest - var metadata runtime.ServerMetadata - + var ( + protoReq GetTopologyRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TopologyService_GetTopology_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetTopology(ctx, &protoReq) return msg, metadata, err - } func request_TopologyService_UpdateLink_0(ctx context.Context, marshaler runtime.Marshaler, client TopologyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateLinkRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateLinkRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateLink(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_TopologyService_UpdateLink_0(ctx context.Context, marshaler runtime.Marshaler, server TopologyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq UpdateLinkRequest - var metadata runtime.ServerMetadata - - if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + var ( + protoReq UpdateLinkRequest + metadata runtime.ServerMetadata + ) + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.UpdateLink(ctx, &protoReq) return msg, metadata, err - } -var ( - filter_TopologyService_DeleteLink_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +var filter_TopologyService_DeleteLink_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} func request_TopologyService_DeleteLink_0(ctx context.Context, marshaler runtime.Marshaler, client TopologyServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteLinkRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteLinkRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TopologyService_DeleteLink_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DeleteLink(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err - } func local_request_TopologyService_DeleteLink_0(ctx context.Context, marshaler runtime.Marshaler, server TopologyServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DeleteLinkRequest - var metadata runtime.ServerMetadata - + var ( + protoReq DeleteLinkRequest + metadata runtime.ServerMetadata + ) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TopologyService_DeleteLink_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DeleteLink(ctx, &protoReq) return msg, metadata, err - } // RegisterTopologyServiceHandlerServer registers the http handlers for service TopologyService to "mux". @@ -161,16 +153,13 @@ func local_request_TopologyService_DeleteLink_0(ctx context.Context, marshaler r // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterTopologyServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterTopologyServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server TopologyServiceServer) error { - - mux.Handle("POST", pattern_TopologyService_AddLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_TopologyService_AddLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/AddLink", runtime.WithHTTPPathPattern("/topology/create")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/AddLink", runtime.WithHTTPPathPattern("/topology/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -182,20 +171,15 @@ func RegisterTopologyServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_AddLink_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_TopologyService_GetTopology_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_TopologyService_GetTopology_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/GetTopology", runtime.WithHTTPPathPattern("/topology")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/GetTopology", runtime.WithHTTPPathPattern("/topology")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -207,20 +191,15 @@ func RegisterTopologyServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_GetTopology_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_TopologyService_UpdateLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_TopologyService_UpdateLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/UpdateLink", runtime.WithHTTPPathPattern("/topology/update")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/UpdateLink", runtime.WithHTTPPathPattern("/topology/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -232,20 +211,15 @@ func RegisterTopologyServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_UpdateLink_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_TopologyService_DeleteLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_TopologyService_DeleteLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/DeleteLink", runtime.WithHTTPPathPattern("/topology/delete")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.topology.TopologyService/DeleteLink", runtime.WithHTTPPathPattern("/topology/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -257,9 +231,7 @@ func RegisterTopologyServiceHandlerServer(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_DeleteLink_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) return nil @@ -286,7 +258,6 @@ func RegisterTopologyServiceHandlerFromEndpoint(ctx context.Context, mux *runtim } }() }() - return RegisterTopologyServiceHandler(ctx, mux, conn) } @@ -302,14 +273,11 @@ func RegisterTopologyServiceHandler(ctx context.Context, mux *runtime.ServeMux, // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "TopologyServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterTopologyServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client TopologyServiceClient) error { - - mux.Handle("POST", pattern_TopologyService_AddLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_TopologyService_AddLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/AddLink", runtime.WithHTTPPathPattern("/topology/create")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/AddLink", runtime.WithHTTPPathPattern("/topology/create")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -320,18 +288,13 @@ func RegisterTopologyServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_AddLink_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("GET", pattern_TopologyService_GetTopology_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_TopologyService_GetTopology_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/GetTopology", runtime.WithHTTPPathPattern("/topology")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/GetTopology", runtime.WithHTTPPathPattern("/topology")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -342,18 +305,13 @@ func RegisterTopologyServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_GetTopology_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("POST", pattern_TopologyService_UpdateLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodPost, pattern_TopologyService_UpdateLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/UpdateLink", runtime.WithHTTPPathPattern("/topology/update")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/UpdateLink", runtime.WithHTTPPathPattern("/topology/update")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -364,18 +322,13 @@ func RegisterTopologyServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_UpdateLink_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - mux.Handle("DELETE", pattern_TopologyService_DeleteLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodDelete, pattern_TopologyService_DeleteLink_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/DeleteLink", runtime.WithHTTPPathPattern("/topology/delete")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.topology.TopologyService/DeleteLink", runtime.WithHTTPPathPattern("/topology/delete")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -386,30 +339,21 @@ func RegisterTopologyServiceHandlerClient(ctx context.Context, mux *runtime.Serv runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_TopologyService_DeleteLink_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil } var ( - pattern_TopologyService_AddLink_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"topology", "create"}, "")) - + pattern_TopologyService_AddLink_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"topology", "create"}, "")) pattern_TopologyService_GetTopology_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"topology"}, "")) - - pattern_TopologyService_UpdateLink_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"topology", "update"}, "")) - - pattern_TopologyService_DeleteLink_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"topology", "delete"}, "")) + pattern_TopologyService_UpdateLink_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"topology", "update"}, "")) + pattern_TopologyService_DeleteLink_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"topology", "delete"}, "")) ) var ( - forward_TopologyService_AddLink_0 = runtime.ForwardResponseMessage - + forward_TopologyService_AddLink_0 = runtime.ForwardResponseMessage forward_TopologyService_GetTopology_0 = runtime.ForwardResponseMessage - - forward_TopologyService_UpdateLink_0 = runtime.ForwardResponseMessage - - forward_TopologyService_DeleteLink_0 = runtime.ForwardResponseMessage + forward_TopologyService_UpdateLink_0 = runtime.ForwardResponseMessage + forward_TopologyService_DeleteLink_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/transport/transport.pb.go b/api/go/gosdn/transport/transport.pb.go index 24ebcfbe0..22768e44c 100755 --- a/api/go/gosdn/transport/transport.pb.go +++ b/api/go/gosdn/transport/transport.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.36.4 // protoc (unknown) // source: gosdn/transport/transport.proto @@ -14,6 +14,7 @@ import ( _ "google.golang.org/protobuf/types/descriptorpb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -24,20 +25,19 @@ const ( ) type TransportOption struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` - Tls bool `protobuf:"varint,4,opt,name=tls,proto3" json:"tls,omitempty"` - // Types that are assignable to TransportOption: + state protoimpl.MessageState `protogen:"open.v1"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` + Tls bool `protobuf:"varint,4,opt,name=tls,proto3" json:"tls,omitempty"` + // Types that are valid to be assigned to TransportOption: // // *TransportOption_GnmiTransportOption // *TransportOption_RestconfTransportOption TransportOption isTransportOption_TransportOption `protobuf_oneof:"transport_option"` Type southbound.Type `protobuf:"varint,7,opt,name=type,proto3,enum=gosdn.southbound.Type" json:"type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TransportOption) Reset() { @@ -98,23 +98,27 @@ func (x *TransportOption) GetTls() bool { return false } -func (m *TransportOption) GetTransportOption() isTransportOption_TransportOption { - if m != nil { - return m.TransportOption +func (x *TransportOption) GetTransportOption() isTransportOption_TransportOption { + if x != nil { + return x.TransportOption } return nil } func (x *TransportOption) GetGnmiTransportOption() *GnmiTransportOption { - if x, ok := x.GetTransportOption().(*TransportOption_GnmiTransportOption); ok { - return x.GnmiTransportOption + if x != nil { + if x, ok := x.TransportOption.(*TransportOption_GnmiTransportOption); ok { + return x.GnmiTransportOption + } } return nil } func (x *TransportOption) GetRestconfTransportOption() *RestconfTransportOption { - if x, ok := x.GetTransportOption().(*TransportOption_RestconfTransportOption); ok { - return x.RestconfTransportOption + if x != nil { + if x, ok := x.TransportOption.(*TransportOption_RestconfTransportOption); ok { + return x.RestconfTransportOption + } } return nil } @@ -143,14 +147,13 @@ func (*TransportOption_GnmiTransportOption) isTransportOption_TransportOption() func (*TransportOption_RestconfTransportOption) isTransportOption_TransportOption() {} type GnmiTransportOption struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Compression string `protobuf:"bytes,1,opt,name=compression,proto3" json:"compression,omitempty"` - GrpcDialOptions map[string]string `protobuf:"bytes,2,rep,name=grpc_dial_options,json=grpcDialOptions,proto3" json:"grpc_dial_options,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` - Encoding gnmi.Encoding `protobuf:"varint,4,opt,name=encoding,proto3,enum=gnmi.Encoding" json:"encoding,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Compression string `protobuf:"bytes,1,opt,name=compression,proto3" json:"compression,omitempty"` + GrpcDialOptions map[string]string `protobuf:"bytes,2,rep,name=grpc_dial_options,json=grpcDialOptions,proto3" json:"grpc_dial_options,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` + Encoding gnmi.Encoding `protobuf:"varint,4,opt,name=encoding,proto3,enum=gnmi.Encoding" json:"encoding,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GnmiTransportOption) Reset() { @@ -212,9 +215,9 @@ func (x *GnmiTransportOption) GetEncoding() gnmi.Encoding { } type RestconfTransportOption struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RestconfTransportOption) Reset() { @@ -249,7 +252,7 @@ func (*RestconfTransportOption) Descriptor() ([]byte, []int) { var File_gosdn_transport_transport_proto protoreflect.FileDescriptor -var file_gosdn_transport_transport_proto_rawDesc = []byte{ +var file_gosdn_transport_transport_proto_rawDesc = string([]byte{ 0x0a, 0x1f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, @@ -309,16 +312,16 @@ var file_gosdn_transport_transport_proto_rawDesc = []byte{ 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +}) var ( file_gosdn_transport_transport_proto_rawDescOnce sync.Once - file_gosdn_transport_transport_proto_rawDescData = file_gosdn_transport_transport_proto_rawDesc + file_gosdn_transport_transport_proto_rawDescData []byte ) func file_gosdn_transport_transport_proto_rawDescGZIP() []byte { file_gosdn_transport_transport_proto_rawDescOnce.Do(func() { - file_gosdn_transport_transport_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_transport_transport_proto_rawDescData) + file_gosdn_transport_transport_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_gosdn_transport_transport_proto_rawDesc), len(file_gosdn_transport_transport_proto_rawDesc))) }) return file_gosdn_transport_transport_proto_rawDescData } @@ -358,7 +361,7 @@ func file_gosdn_transport_transport_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_gosdn_transport_transport_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_transport_transport_proto_rawDesc), len(file_gosdn_transport_transport_proto_rawDesc)), NumEnums: 0, NumMessages: 4, NumExtensions: 0, @@ -369,7 +372,6 @@ func file_gosdn_transport_transport_proto_init() { MessageInfos: file_gosdn_transport_transport_proto_msgTypes, }.Build() File_gosdn_transport_transport_proto = out.File - file_gosdn_transport_transport_proto_rawDesc = nil file_gosdn_transport_transport_proto_goTypes = nil file_gosdn_transport_transport_proto_depIdxs = nil } diff --git a/api/openapiv2/gosdn_northbound.swagger.json b/api/openapiv2/gosdn_northbound.swagger.json index faefcc2b9..a000de65c 100755 --- a/api/openapiv2/gosdn_northbound.swagger.json +++ b/api/openapiv2/gosdn_northbound.swagger.json @@ -709,6 +709,37 @@ ] } }, + "/plugins": { + "get": { + "operationId": "PluginInternalService_GetAvailablePlugins", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gosdnplugin_registryGetResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "timestamp", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + } + ], + "tags": [ + "PluginInternalService" + ] + } + }, "/pnd/{pid}": { "get": { "summary": "Allows to request a specific Principal Network Domain.", diff --git a/api/proto/gosdn/networkelement/networkelement.proto b/api/proto/gosdn/networkelement/networkelement.proto index b2a14817b..e893c00f2 100755 --- a/api/proto/gosdn/networkelement/networkelement.proto +++ b/api/proto/gosdn/networkelement/networkelement.proto @@ -407,4 +407,4 @@ message SubscribePathRequest { message SubscribePathResponse { int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. repeated gnmi.Notification mne_notification = 2; -} +} \ No newline at end of file diff --git a/api/proto/gosdn/plugin-internal/plugin-internal.proto b/api/proto/gosdn/plugin-internal/plugin-internal.proto index 85b721572..70ad2e22f 100755 --- a/api/proto/gosdn/plugin-internal/plugin-internal.proto +++ b/api/proto/gosdn/plugin-internal/plugin-internal.proto @@ -4,21 +4,21 @@ package gosdn.plugin_internal; import "buf/validate/validate.proto"; import "gosdn/plugin-registry/plugin-registry.proto"; +import "google/api/annotations.proto"; + option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-internal"; service PluginInternalService { rpc AvailablePlugins(GetAvailablePluginsRequest) returns (gosdn.plugin_registry.GetResponse); rpc GetPluginSchema(GetPluginSchemaRequest) returns (stream PluginSchemaPayload); + rpc GetAvailablePlugins(GetAvailablePluginsRequest) returns (gosdn.plugin_registry.GetResponse) { + option (google.api.http) = {get: "/plugins"}; } - -message GetAvailablePluginsRequest { - int64 timestamp = 1; } -message GetAvailablePluginsResponse { +message GetAvailablePluginsRequest { int64 timestamp = 1; - repeated gosdn.plugin_registry.Plugin plugins = 2; } message GetPluginSchemaRequest { @@ -29,3 +29,8 @@ message GetPluginSchemaRequest { message PluginSchemaPayload { bytes chunk = 1; } + +message GetAvailablePluginsResponse { + int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. + repeated gosdn.plugin_registry.Plugin plugins = 2; +} \ No newline at end of file diff --git a/api/proto/gosdn/plugin-registry/plugin-registry.proto b/api/proto/gosdn/plugin-registry/plugin-registry.proto index ee4040c58..1210ab99c 100755 --- a/api/proto/gosdn/plugin-registry/plugin-registry.proto +++ b/api/proto/gosdn/plugin-registry/plugin-registry.proto @@ -4,6 +4,8 @@ package gosdn.plugin_registry; import "google/protobuf/timestamp.proto"; import "buf/validate/validate.proto"; +import "google/api/annotations.proto"; + option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"; @@ -64,3 +66,12 @@ message Manifest { string author = 3; string version = 4; } + +message GetAvailablePluginsResponse { + int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. + repeated gosdn.plugin_registry.Plugin plugins = 2; +} + +message GetAvailablePluginsRequest { + int64 timestamp = 1; +} \ No newline at end of file diff --git a/api/proto/gosdn/plugin/plugin.proto b/api/proto/gosdn/plugin/plugin.proto index 80b6bec34..6d7ca8447 100755 --- a/api/proto/gosdn/plugin/plugin.proto +++ b/api/proto/gosdn/plugin/plugin.proto @@ -4,8 +4,11 @@ package gosdn.plugin; import "github.com/openconfig/gnmi/proto/gnmi/gnmi.proto"; import "buf/validate/validate.proto"; +import "google/api/annotations.proto"; + import "gosdn/networkelement/networkelement.proto"; +import "gosdn/plugin-registry/plugin-registry.proto"; option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin"; @@ -20,6 +23,7 @@ service Plugin { rpc SchemaTreeGzip(SchemaTreeGzipRequest) returns (stream Payload); rpc ValidateChange(ValidateChangeRequest) returns (ValidateChangeResponse); rpc PruneConfigFalse(PruneConfigFalseRequest) returns (PruneConfigFalseResponse); + rpc GetAvailablePlugins(GetAvailablePluginsRequest) returns (gosdn.plugin_registry.GetResponse); } message UnmarshalRequest { @@ -99,3 +103,7 @@ message SchemaTreeGzipRequest { message Payload { bytes chunk = 1; } + +message GetAvailablePluginsRequest { + int64 timestamp = 1; + } \ No newline at end of file diff --git a/controller/controller.go b/controller/controller.go index 32adf3586..3b339bd52 100755 --- a/controller/controller.go +++ b/controller/controller.go @@ -349,6 +349,7 @@ func ensureAdminRoleExists() error { "/gosdn.networkelement.NetworkElementService/ParseYang", "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins", "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema", + "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins", "/gosdn.app.AppService/Register", "/gosdn.app.AppService/Deregister", "/gosdn.configurationmanagement.ConfigurationManagementService/ExportSDNConfig", diff --git a/controller/http.go b/controller/http.go index 394b7a0b0..684b8f83f 100755 --- a/controller/http.go +++ b/controller/http.go @@ -16,6 +16,7 @@ import ( "google.golang.org/grpc/status" mnegw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" + plg "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-internal" pgw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" agw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" tgw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology" @@ -85,6 +86,11 @@ func setupHttpServer() error { return err } + err = plg.RegisterPluginInternalServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts) + if err != nil { + return err + } + // Set the HTTP server of core to the new server c.httpServer = &http.Server{Addr: ":8080", Handler: mux, diff --git a/controller/northbound/server/plugin.go b/controller/northbound/server/plugin.go index 3338520da..8e73994d3 100755 --- a/controller/northbound/server/plugin.go +++ b/controller/northbound/server/plugin.go @@ -55,6 +55,22 @@ func (pis *PluginInternalServer) AvailablePlugins(ctx context.Context, request * return pis.pluginRegistryClient.GetAll(ctx, getAllRequest) } +func (pis *PluginInternalServer) GetAvailablePlugins(ctx context.Context, request *pipb.GetAvailablePluginsRequest) (*rpb.GetResponse, error) { + ctx, cancel := context.WithTimeout(ctx, time.Minute*1) + defer cancel() + + if err := pis.protoValidator.Validate(request); err != nil { + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + getAllRequest := &rpb.GetAllRequest{ + Timestamp: time.Now().UnixNano(), + } + + return pis.pluginRegistryClient.GetAll(ctx, getAllRequest) + +} + func (pis *PluginInternalServer) GetPluginSchema(request *pipb.GetPluginSchemaRequest, stream pipb.PluginInternalService_GetPluginSchemaServer) error { labels := prometheus.Labels{"service": "plugin", "rpc": "get plugin schema"} start := metrics.StartHook(labels, grpcRequestsTotal) diff --git a/react-ui/src/components/login/view/login.view.tsx b/react-ui/src/components/login/view/login.view.tsx index 62c84eeb8..6b782e877 100755 --- a/react-ui/src/components/login/view/login.view.tsx +++ b/react-ui/src/components/login/view/login.view.tsx @@ -31,7 +31,7 @@ const LoginView: React.FC<BasicProp> = () => { <Image src={logo} alt="logo" height={150} /> </Row> <Row className="mt-2 justify-content-center"> - <Col md={6} sm={10} className="c-box p-4"> + <Col md={6} sm={10} className="c-box p-4 bg-white"> <h1 className="text-center h2">goSDN - Web</h1> {handleErrorMessageRendering(invalidForm, invalidCredentials)} -- GitLab From af0611e06c89bfb60fcf3ff0e522b7b0534d71d1 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 6 Feb 2025 19:05:00 +0100 Subject: [PATCH 68/78] (ui): added 'add_device' functionality --- react-ui/package.json | 1 + react-ui/src/.prettierrc | 4 + .../devices/reducer/plugin.reducer.ts | 75 +---- .../devices/routines/mne.routine.ts | 1 - .../devices/routines/plugin.routine.ts | 36 +++ .../devices/view/device.view.list.tsx | 186 +++++++----- .../components/devices/view/device.view.tsx | 146 +++++---- .../devices/view/subcomponent/modal.view.tsx | 279 ++++++++++-------- .../devices/view_model/device.viewmodel.ts | 21 +- .../devices/view_model/modal.viewmodel.ts | 92 +++++- .../src/i18n/locales/en/translations.json | 46 +++ react-ui/src/shared/api/api.ts | 24 ++ react-ui/src/stores/persist.store.ts | 4 + react-ui/yarn.lock | 5 + 14 files changed, 578 insertions(+), 342 deletions(-) create mode 100644 react-ui/src/.prettierrc create mode 100644 react-ui/src/components/devices/routines/plugin.routine.ts diff --git a/react-ui/package.json b/react-ui/package.json index 8bdbbfa50..76af9e08b 100755 --- a/react-ui/package.json +++ b/react-ui/package.json @@ -26,6 +26,7 @@ "react-dom": "^18.3.1", "react-error-boundary": "^4.1.2", "react-grid-layout": "^1.5.0", + "react-hook-form": "^7.54.2", "react-i18next": "^15.0.0", "react-loading-skeleton": "^3.5.0", "react-redux": "^9.1.2", diff --git a/react-ui/src/.prettierrc b/react-ui/src/.prettierrc new file mode 100644 index 000000000..222861c34 --- /dev/null +++ b/react-ui/src/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 2, + "useTabs": false +} diff --git a/react-ui/src/components/devices/reducer/plugin.reducer.ts b/react-ui/src/components/devices/reducer/plugin.reducer.ts index 1a09876fe..f11f24477 100644 --- a/react-ui/src/components/devices/reducer/plugin.reducer.ts +++ b/react-ui/src/components/devices/reducer/plugin.reducer.ts @@ -1,15 +1,10 @@ import { NetworkelementFlattenedManagedNetworkElement, NetworkelementManagedNetworkElement, - PndPrincipalNetworkDomain + PluginRegistryPlugin } from '@api/api' import { createSlice, PayloadAction } from '@reduxjs/toolkit' -import { refreshUpdateTimer } from '@shared/reducer/routine.reducer' -import { Category, CategoryType } from '@shared/types/category.type' -import { REHYDRATE } from 'redux-persist' -import { RootState } from 'src/stores' import '../routines/index' -import { startListening } from '/src/stores/middleware/listener.middleware' export type Device = NetworkelementFlattenedManagedNetworkElement @@ -19,14 +14,11 @@ interface SelectedObject { json: JSON | null } -export interface DeviceSliceState { - devices: Device[] - pnds: PndPrincipalNetworkDomain[] - - selected: SelectedObject | null +export interface PluginSliceState { + plugins: Array<PluginRegistryPlugin> } -const initialState: DeviceSliceState = { +const initialState: PluginSliceState = { plugins: [], } @@ -37,63 +29,18 @@ interface SetSelectedDeviceType { } } -const deviceSlice = createSlice({ +const pluginSlice = createSlice({ name: 'plugins', initialState, reducers: { - setPlugins: (state, action: PayloadAction<Plugin[] | undefined>) => { - state.devices = action.payload || [] + setPlugins: (state, action: PayloadAction<PluginRegistryPlugin[] | undefined>) => { + state.plugins = action.payload || [] }, }, }) -export const { setDevices, setSelectedDevice, setSelectedMne, setSelectedJson, setPnds } = - deviceSlice.actions - -export default deviceSlice.reducer -export const deviceReducerPath = deviceSlice.reducerPath - -// add default selected device if no selected device is set -startListening({ - predicate: (action) => setDevices.match(action), - effect: async (action, listenerApi) => { - const { device: state } = listenerApi.getOriginalState() as RootState - if (state.selected) { - return - } - - // if there are no devices available do set null - const device = action.payload?.[0] || null - listenerApi.dispatch(setSelectedDevice({ device } as SetSelectedDeviceType)) - }, -}) - -startListening({ - predicate: (action) => setSelectedMne.match(action), - effect: async (action, listenerApi) => { - listenerApi.dispatch(refreshUpdateTimer(Category.TAB as CategoryType)) - }, -}) +export const { setPlugins } = + pluginSlice.actions -startListening({ - predicate: (action) => setDevices.match(action), - effect: async (action, listenerApi) => { - listenerApi.dispatch(refreshUpdateTimer(Category.DEVICE as CategoryType)) - }, -}) - -/** - * On startup reset the selected device - */ -startListening({ - predicate: ({ type }: any) => type === REHYDRATE, - effect: async (_, listenerApi) => { - const { device: state } = listenerApi.getState() as RootState - const device = state.selected?.device - if (!device) { - return - } - - listenerApi.dispatch(setSelectedDevice({ device, options: { bypassCheck: true } } as SetSelectedDeviceType)) - }, -}) \ No newline at end of file +export default pluginSlice.reducer +export const pluginReducerPath = pluginSlice.reducerPath diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts index 292869307..967da2615 100755 --- a/react-ui/src/components/devices/routines/mne.routine.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -13,7 +13,6 @@ import { startListening } from '../../../stores/middleware/listener.middleware' export const FETCH_MNE_ACTION = 'subscription/device/fetchSelectedMNE' - /** * #0 * Trigger fetch MNE (#1) diff --git a/react-ui/src/components/devices/routines/plugin.routine.ts b/react-ui/src/components/devices/routines/plugin.routine.ts new file mode 100644 index 000000000..ece4608f7 --- /dev/null +++ b/react-ui/src/components/devices/routines/plugin.routine.ts @@ -0,0 +1,36 @@ +import { PluginInternalServiceGetAvailablePluginsApiArg, api } from "@api/api" +import { warnMessage } from "@helper/debug" +import { createAsyncThunk } from "@reduxjs/toolkit" +import { RootState } from "src/stores" +import { setPlugins } from "../reducer/plugin.reducer" + +const FETCH_PLUGIN_ACTION = 'subscription/plugin/fetchPlugins' + + +export const fetchPluginsThunk = createAsyncThunk( + FETCH_PLUGIN_ACTION, + async (_, thunkApi) => { + const { user } = thunkApi.getState() as RootState + + if (!user.user?.roles) { + warnMessage('Plugin fetch was triggered but user data is not presence') + return + } + + const payload: PluginInternalServiceGetAvailablePluginsApiArg = { + timestamp: new Date().getTime().toString(), + } + + + const plugins = await thunkApi.dispatch(api.endpoints.pluginInternalServiceGetAvailablePlugins.initiate(payload)) + + if (plugins.error || !plugins.data?.plugins) { + warnMessage('Plugin fetch returned an error: ' + plugins.error) + return + } + + thunkApi.dispatch( + setPlugins(plugins.data?.plugins) + ) + } +) \ No newline at end of file diff --git a/react-ui/src/components/devices/view/device.view.list.tsx b/react-ui/src/components/devices/view/device.view.list.tsx index 53f1580d1..868f26959 100755 --- a/react-ui/src/components/devices/view/device.view.list.tsx +++ b/react-ui/src/components/devices/view/device.view.list.tsx @@ -1,94 +1,122 @@ import { insertMarkTags } from "@helper/text"; import { useAppSelector } from "@hooks"; -import DOMPurify from 'dompurify'; -import { RefObject, useCallback, useRef } from 'react'; -import { Col, OverlayTrigger, Row, Tooltip } from 'react-bootstrap'; +import DOMPurify from "dompurify"; +import { RefObject, useCallback, useRef } from "react"; +import { Col, OverlayTrigger, Row, Tooltip } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { Device } from "../reducer/device.reducer"; import { useDeviceTableViewModel } from "../view_model/device.list.viewmodel"; const cropUUID = (uuid: string): string => { - return uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length); + return ( + uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length) + ); }; -export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElement> }) => { - const { devices, pnds, selected: selectedDevice } = useAppSelector(state => state.device); - const { t } = useTranslation('common'); - const listRef = useRef<HTMLDivElement>(null); - const { dispatchDevice } = useDeviceTableViewModel(searchRef, listRef); +export const DeviceList = ({ + searchRef, +}: { + searchRef: RefObject<HTMLInputElement>; +}) => { + const { + devices, + pnds, + selected: selectedDevice, + } = useAppSelector((state) => state.device); + const { t } = useTranslation("common"); + const listRef = useRef<HTMLDivElement>(null); + const { dispatchDevice } = useDeviceTableViewModel(searchRef, listRef); - const handleItemClick = useCallback((device: Device) => { - dispatchDevice(device) - }, []); + const handleItemClick = useCallback((device: Device) => { + dispatchDevice(device); + }, []); - const getDeviceList = useCallback(() => { - const search = searchRef?.current?.value; - let filtered = devices; + const getDeviceList = useCallback(() => { + const search = searchRef?.current?.value; + let filtered = devices; - if (search) { - filtered = devices.filter((device) => { - const user = pnds.find(pnd => pnd.id === device.pid); - return device.id?.includes(search) || - device.name?.includes(search) || - user?.name?.includes(search); - }); - } + if (search) { + filtered = devices.filter((device) => { + const user = pnds.find((pnd) => pnd.id === device.pid); + return ( + device.id?.includes(search) || + device.name?.includes(search) || + user?.name?.includes(search) + ); + }); + } - return filtered.map((device) => { - const user = pnds.find(pnd => pnd.id === device.pid); - const username = user?.name || ''; - const deviceId = device.id!; - const croppedId = cropUUID(deviceId); - const devicename = device.name || ''; - const isSelected = selectedDevice?.device.id === deviceId; + return filtered.map((device) => { + const user = pnds.find((pnd) => pnd.id === device.pid); + const username = user?.name || ""; + const deviceId = device.id!; + const croppedId = cropUUID(deviceId); + const devicename = device.name || ""; + const isSelected = selectedDevice?.device.id === deviceId; - return ( - <div - key={deviceId} - className={`border-bottom border-primary p-2 transitions ${isSelected && 'bg-gradient-fade py-2'} ${!isSelected && 'text-disabled disabled-hover'}`} - onClick={() => handleItemClick(device)} - > - <Row - className="align-items-center clickable" - onClick={() => handleItemClick(device)} - > - <Col xs={12} sm={5} > - <span dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(devicename, search) : DOMPurify.sanitize(devicename) - }} /> - </Col> - <Col xs={12} sm={3} > - <OverlayTrigger overlay={<Tooltip id={deviceId}>{deviceId}</Tooltip>}> - <span className="text-gray-500" dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(croppedId, search) : DOMPurify.sanitize(croppedId) - }} /> - </OverlayTrigger> - </Col> - <Col xs={12} sm={4} > - <span className="text-gray-500" dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(username, search) : DOMPurify.sanitize(username) - }} /> - </Col> - </Row> - </div> - ); - }); - }, [devices, searchRef, pnds, selectedDevice, handleItemClick]); - - return ( - <div className="rounded border border-primary mt-2"> - <Row className="border-bottom border-primary px-2 py-2 mx-0"> - <Col xs={12} sm={5} > - <span className="font-medium">{t('device.table.header.name')}</span> - </Col> - <Col xs={12} sm={3} > - <span className="font-medium">{t('device.table.header.uuid')}</span> - </Col> - <Col xs={12} sm={4} > - <span className="font-medium">{t('device.table.header.user')}</span> - </Col> - </Row> - <div ref={listRef}>{getDeviceList()}</div> + return ( + <div + key={deviceId} + className={`border-bottom border-primary p-2 transitions ${isSelected && "bg-gradient-fade py-2"} ${!isSelected && "text-disabled disabled-hover"}`} + onClick={() => handleItemClick(device)} + > + <Row + className="align-items-center clickable" + onClick={() => handleItemClick(device)} + > + <Col xs={12} sm={5}> + <span + dangerouslySetInnerHTML={{ + __html: search + ? insertMarkTags(devicename, search) + : DOMPurify.sanitize(devicename), + }} + /> + </Col> + <Col xs={12} sm={3}> + <OverlayTrigger + overlay={<Tooltip id={deviceId}>{deviceId}</Tooltip>} + > + <span + className="text-gray-500" + dangerouslySetInnerHTML={{ + __html: search + ? insertMarkTags(croppedId, search) + : DOMPurify.sanitize(croppedId), + }} + /> + </OverlayTrigger> + </Col> + <Col xs={12} sm={4}> + <span + className="text-gray-500" + dangerouslySetInnerHTML={{ + __html: search + ? insertMarkTags(username, search) + : DOMPurify.sanitize(username), + }} + /> + </Col> + </Row> </div> - ); -}; \ No newline at end of file + ); + }); + }, [devices, searchRef, pnds, selectedDevice, handleItemClick]); + + return ( + <div className="rounded border border-primary mt-2"> + <Row className="border-bottom border-primary px-2 py-2 mx-0"> + <Col xs={12} sm={5}> + <span className="font-medium">{t("device.table.header.name")}</span> + </Col> + <Col xs={12} sm={3}> + <span className="font-medium">{t("device.table.header.uuid")}</span> + </Col> + <Col xs={12} sm={4}> + <span className="font-medium">{t("device.table.header.user")}</span> + </Col> + </Row> + <div ref={listRef}>{getDeviceList()}</div> + </div> + ); +}; diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 290697ac6..814f51db1 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,69 +1,91 @@ -import { faCircleInfo, faPlus, faServer, faSliders } from '@fortawesome/free-solid-svg-icons'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { GridLayout } from '@layout/grid.layout/grid.layout'; -import { GridBox } from '@shared/components/box/gridBox.view'; -import { JsonViewer } from '@shared/components/json_viewer/view/json_viewer.view'; -import { useRef } from 'react'; -import { Button, Col, Form, Row } from 'react-bootstrap'; -import { useTranslation } from 'react-i18next'; -import { useDeviceViewModel } from '../view_model/device.viewmodel'; -import './device.scss'; -import { DeviceList } from './device.view.list'; -import { DeviceListCollapsable } from './subcomponent/device.view.list-detail'; +import { + faCircleInfo, + faPlus, + faServer, + faSliders, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { GridLayout } from "@layout/grid.layout/grid.layout"; +import { GridBox } from "@shared/components/box/gridBox.view"; +import { JsonViewer } from "@shared/components/json_viewer/view/json_viewer.view"; +import { useRef } from "react"; +import { Button, Col, Form, Row } from "react-bootstrap"; +import { useTranslation } from "react-i18next"; +import { useDeviceViewModel } from "../view_model/device.viewmodel"; +import "./device.scss"; +import { DeviceList } from "./device.view.list"; +import { DeviceListCollapsable } from "./subcomponent/device.view.list-detail"; +import AddDeviceModal from "./subcomponent/modal.view"; const DeviceView = () => { - const { t } = useTranslation('common'); - const searchRef = useRef<HTMLInputElement>(null); - const { jsonYang } = useDeviceViewModel(); + const { t } = useTranslation("common"); + const searchRef = useRef<HTMLInputElement>(null); + const { jsonYang, openAddModal, closeModal, addModal } = useDeviceViewModel(); - return ( - <GridLayout> - <> - <div key="device-list"> - <GridBox title={t("device.box.list.title")} title_icon={faServer}> - <Row className="mb-3 align-items-center"> - <Col xs={12} md={6} lg={8}> - <Form.Group controlId='device.search'> - <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={searchRef} /> - </Form.Group> - </Col> - <Col xs={12} md={6} lg={4} className='mt-3 mt-md-0 text-md-end'> - <Button variant='primary::button' className='btn-primary-button'> - <FontAwesomeIcon icon={faPlus} className='me-2' /> - {t('device.add_device_button')} - </Button> - </Col> - </Row> - <Row> - <Col xs={12} className='h-auto'> - <DeviceList searchRef={searchRef} /> - </Col> - </Row> - </GridBox> - </div> + return ( + <GridLayout> + <> + <div key="device-list"> + <GridBox title={t("device.box.list.title")} title_icon={faServer}> + <Row className="mb-3 align-items-center"> + <Col xs={12} md={6} lg={8}> + <Form.Group controlId="device.search"> + <Form.Control + type="text" + placeholder={t("device.search.placeholder")} + ref={searchRef} + /> + </Form.Group> + </Col> + <Col xs={12} md={6} lg={4} className="mt-3 mt-md-0 text-md-end"> + <Button + variant="primary::button" + className="btn-primary-button" + onClick={() => openAddModal()} + > + <FontAwesomeIcon icon={faPlus} className="me-2" /> + {t("device.add_device_button")} + </Button> - <div key="device-metadata"> - <GridBox title={t("device.box.information.title")} title_icon={faCircleInfo}> - <Row> - <Col xs={12} > - <DeviceListCollapsable search={searchRef.current?.value || ''} /> - </Col> - </Row> - </GridBox> - </div> + <AddDeviceModal show={addModal} onHide={() => closeModal()} /> + </Col> + </Row> + <Row> + <Col xs={12} className="h-auto"> + <DeviceList searchRef={searchRef} /> + </Col> + </Row> + </GridBox> + </div> - <div key="device-details"> - <GridBox title={t('device.box.configuration.title')} title_icon={faSliders}> - <Row> - <Col xs={12}> - {jsonYang && <JsonViewer json={jsonYang} />} - </Col> - </Row> - </GridBox> - </div> - </> - </GridLayout> - ); + <div key="device-metadata"> + <GridBox + title={t("device.box.information.title")} + title_icon={faCircleInfo} + > + <Row> + <Col xs={12}> + <DeviceListCollapsable + search={searchRef.current?.value || ""} + /> + </Col> + </Row> + </GridBox> + </div> + + <div key="device-details"> + <GridBox + title={t("device.box.configuration.title")} + title_icon={faSliders} + > + <Row> + <Col xs={12}>{jsonYang && <JsonViewer json={jsonYang} />}</Col> + </Row> + </GridBox> + </div> + </> + </GridLayout> + ); }; -export default DeviceView; \ No newline at end of file +export default DeviceView; diff --git a/react-ui/src/components/devices/view/subcomponent/modal.view.tsx b/react-ui/src/components/devices/view/subcomponent/modal.view.tsx index d798e7ade..fd5936412 100644 --- a/react-ui/src/components/devices/view/subcomponent/modal.view.tsx +++ b/react-ui/src/components/devices/view/subcomponent/modal.view.tsx @@ -1,141 +1,162 @@ -import { NetworkelementAddListRequest, useNetworkElementServiceAddListMutation } from '@api/api'; -import React, { useState } from 'react'; -import { Button, Form, Modal } from 'react-bootstrap'; +import { useModalViewModel } from "@component/devices/view_model/modal.viewmodel"; +import { useAppSelector } from "@hooks"; +import React from "react"; +import { Alert, Button, Form, Modal } from "react-bootstrap"; +import { useTranslation } from "react-i18next"; interface AddDeviceModalProps { - show: boolean; - onHide: () => void; -} - -interface FormData { - address: '', - mneName: '', - transportOption: undefined, - gnmiSubscribePaths: [], + show: boolean; + onHide: () => void; } const AddDeviceModal: React.FC<AddDeviceModalProps> = ({ show, onHide }) => { - const [addNetworkElement] = useNetworkElementServiceAddListMutation(); - const [formData, setFormData] = useState<FormData>({ - address: '', - mneName: '', - transportOption: undefined, - gnmiSubscribePaths: [], - }); - - const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => { - const { name, value } = e.target; - setFormData(prev => ({ - ...prev, - [name]: value - })); - }; - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); + const { loading, register, handleSubmit, errors } = useModalViewModel({ + hide: onHide, + }); + const { plugins } = useAppSelector((state) => state.plugin); + const { t } = useTranslation("common"); - const request: NetworkelementAddListRequest = { - timestamp: Date.now().toString(), // Convert to nanoseconds if needed - mne: [formData], - pid: formData.pid - }; + return ( + <Modal show={show} onHide={onHide} centered size="lg"> + <Modal.Header closeButton> + <Modal.Title>{t("device.add_device.title")}</Modal.Title> + </Modal.Header> + <Modal.Body> + {errors.root && ( + <Alert variant="danger" className="mt-3"> + {errors.root.message || t("device.add_device.error")} + </Alert> + )} + <Form onSubmit={handleSubmit}> + <Form.Group className="mb-3"> + <Form.Label> + {t("device.add_device.fields.mne_name.label")} + </Form.Label> + <Form.Control + type="text" + placeholder={t("device.add_device.fields.mne_name.placeholder")} + isInvalid={!!errors.mneName} + {...register("mneName", { + required: t("device.add_device.fields.mne_name.required"), + })} + /> + <Form.Control.Feedback type="invalid"> + {errors.mneName?.message} + </Form.Control.Feedback> + </Form.Group> + <Form.Group className="mb-3"> + <Form.Label> + {t("device.add_device.fields.address.label")} + </Form.Label> + <Form.Control + type="text" + placeholder={t("device.add_device.fields.address.placeholder")} + isInvalid={!!errors.address} + {...register("transportOption.address", { + required: t("device.add_device.fields.address.required"), + })} + /> + <Form.Control.Feedback type="invalid"> + {errors.address?.message} + </Form.Control.Feedback> + </Form.Group> - try { - await addNetworkElement({ networkelementAddListRequest: request }); - handleReset(); - // You might want to add a success notification here - } catch (error) { - console.error('Failed to add device:', error); - // You might want to add an error notification here - } - }; + <Form.Group className="mb-3"> + <Form.Label> + {t("device.add_device.fields.plugin.label")} + </Form.Label> + <Form.Control + as="select" + isInvalid={!!errors.pluginId} + {...register("pluginId", { + required: t("device.add_device.fields.plugin.required"), + })} + > + <option value=""> + {t("device.add_device.fields.plugin.placeholder")} + </option> + {plugins.map((plugin) => ( + <option key={plugin.id} value={plugin.id}> + {plugin.manifest?.name} + </option> + ))} + </Form.Control> + <Form.Control.Feedback type="invalid"> + {errors.pluginId?.message} + </Form.Control.Feedback> + </Form.Group> - const handleReset = () => { - setFormData({ - address: '', - pid: '', - pluginId: '', - mneName: '', - transportOption: undefined, - gnmiSubscribePaths: [], - mneId: '' - }); - onHide(); - }; + <Form.Group className="mb-3"> + <Form.Check + type="checkbox" + label={t("device.add_device.fields.tls.label")} + {...register("transportOption.tls")} + /> + </Form.Group> - return ( - <Modal show={show} onHide={handleReset} centered> - <Modal.Header closeButton> - <Modal.Title>Add New Device</Modal.Title> - </Modal.Header> - <Form onSubmit={handleSubmit}> - <Modal.Body> - <Form.Group className="mb-3"> - <Form.Label>Address</Form.Label> - <Form.Control - type="text" - name="address" - value={formData.address} - onChange={handleInputChange} - placeholder="Enter device address" - /> - </Form.Group> + <h5 className="mt-4"> + {t("device.add_device.fields.credentials.title")} + </h5> + <Form.Group className="mb-3"> + <Form.Label> + {t("device.add_device.fields.credentials.username.label")} + </Form.Label> + <Form.Control + type="text" + placeholder={t( + "device.add_device.fields.credentials.username.placeholder", + )} + isInvalid={!!errors.transportOption?.username} + {...register("transportOption.username", { + required: t( + "device.add_device.fields.credentials.username.required", + ), + })} + /> + <Form.Control.Feedback type="invalid"> + {errors.transportOption?.username?.message} + </Form.Control.Feedback> + </Form.Group> - <Form.Group className="mb-3"> - <Form.Label>PID</Form.Label> - <Form.Control - type="text" - name="pid" - value={formData.pid} - onChange={handleInputChange} - placeholder="Enter PID" - /> - </Form.Group> + <Form.Group className="mb-3"> + <Form.Label> + {t("device.add_device.fields.credentials.password.label")} + </Form.Label> + <Form.Control + type="password" + placeholder={t( + "device.add_device.fields.credentials.password.placeholder", + )} + isInvalid={!!errors.transportOption?.password} + {...register("transportOption.password", { + required: t( + "device.add_device.fields.credentials.password.required", + ), + })} + /> + <Form.Control.Feedback type="invalid"> + {errors.transportOption?.password?.message} + </Form.Control.Feedback> + </Form.Group> - <Form.Group className="mb-3"> - <Form.Label>Plugin ID</Form.Label> - <Form.Control - type="text" - name="pluginId" - value={formData.pluginId} - onChange={handleInputChange} - placeholder="Enter plugin ID" - /> - </Form.Group> - - <Form.Group className="mb-3"> - <Form.Label>MNE Name</Form.Label> - <Form.Control - type="text" - name="mneName" - value={formData.mneName} - onChange={handleInputChange} - placeholder="Enter MNE name" - /> - </Form.Group> - - <Form.Group className="mb-3"> - <Form.Label>MNE ID</Form.Label> - <Form.Control - type="text" - name="mneId" - value={formData.mneId} - onChange={handleInputChange} - placeholder="Enter MNE ID" - /> - </Form.Group> - </Modal.Body> - <Modal.Footer> - <Button variant="secondary" onClick={handleReset}> - Cancel - </Button> - <Button variant="primary" type="submit"> - Add Device - </Button> - </Modal.Footer> - </Form> - </Modal> - ); + <div className="d-flex justify-content-end gap-2"> + <Button variant="secondary" onClick={onHide}> + {t("device.add_device.buttons.cancel")} + </Button> + <Button disabled={loading} variant="primary" type="submit"> + {loading ? ( + <> + <span className="spinner-border spinner-border-sm me-2" /> + {t("device.add_device.buttons.loading")} + </> + ) : ( + t("device.add_device.buttons.submit") + )} + </Button> + </div> + </Form> + </Modal.Body> + </Modal> + ); }; - -export default AddDeviceModal; \ No newline at end of file +export default AddDeviceModal; diff --git a/react-ui/src/components/devices/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts index f2fd63553..5c4acc661 100755 --- a/react-ui/src/components/devices/view_model/device.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.viewmodel.ts @@ -1,8 +1,20 @@ -import { useAppSelector } from '@hooks' -import { useMemo } from 'react' +import { useAppDispatch, useAppSelector } from '@hooks' +import { useMemo, useState } from 'react' +import { fetchPluginsThunk } from '../routines/plugin.routine' export const useDeviceViewModel = () => { + const [addModal, setAddModal] = useState<boolean>(false) const { selected: selectedDevice } = useAppSelector((state) => state.device) + const dispatch = useAppDispatch() + + const openAddModal = () => { + dispatch(fetchPluginsThunk()) + setAddModal(true) + } + + const closeModal = () => { + setAddModal(false) + } const getYangModelJSON = (): JSON | null => { if (!selectedDevice?.json) { @@ -23,6 +35,9 @@ export const useDeviceViewModel = () => { return { jsonYang, - selectedDevice + selectedDevice, + openAddModal, + closeModal, + addModal } } diff --git a/react-ui/src/components/devices/view_model/modal.viewmodel.ts b/react-ui/src/components/devices/view_model/modal.viewmodel.ts index de9bbf68e..98742bd34 100644 --- a/react-ui/src/components/devices/view_model/modal.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/modal.viewmodel.ts @@ -1,10 +1,94 @@ -import { useEffect } from "react" +import { NetworkelementAddListRequest, NetworkelementSetMne, useNetworkElementServiceAddListMutation } from "@api/api"; +import { useAppDispatch, useAppSelector } from "@hooks"; +import { fetchUser } from "@shared/routine/user.routine"; +import { useState } from "react"; +import { SubmitHandler, useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import { toast } from "react-toastify"; +interface FormData { + address: string; + mneName: string; + pluginId: string; + transportOption: { + address: string; + username: string; + password: string; + tls: boolean; + gnmiTransportOption: Object; + }; + gnmiSubscribePaths: string[]; +} -export const useModalViewModel = () => { +type ModalViewModelType = { + hide: () => void +} +export const useModalViewModel = ({ hide }: ModalViewModelType) => { + const dispatch = useAppDispatch() + const [addNetworkElement] = useNetworkElementServiceAddListMutation(); + const [loading, setLoading] = useState<boolean>(false) + const { t } = useTranslation('common') - useEffect(() => { + const { + register, + handleSubmit, + setError, + clearErrors, + formState: { errors }, + reset: resetModal + } = useForm<FormData>(); - }, []) + const { user } = useAppSelector(state => state.user); + + const reset = () => { resetModal(); hide(); } + const success = () => { toast.success(t('device.add_device.success')); reset(); dispatch(fetchUser()) } + + + const onSubmit: SubmitHandler<FormData> = async (data) => { + clearErrors() + setLoading(true) + const mne: NetworkelementSetMne = { + ...data, + gnmiSubscribePaths: [], + transportOption: { + ...data.transportOption, + gnmiTransportOption: {}, + } + } + + if (!user?.id) { + toast.error("global.error.missing_user") + return + } + + const request: NetworkelementAddListRequest = { + timestamp: Date.now().toString(), + mne: [mne], + pid: user.id + }; + + try { + const response = await addNetworkElement({ networkelementAddListRequest: request }); + setLoading(false) + + if (response.error) { + const error = response.error as any + setError('root', error.data) + return + } + + success() + } catch (error) { + setError('root', error?.data?.message || undefined) + } + } + + return { + onSubmit, + handleSubmit: handleSubmit(onSubmit), + register, + errors, + loading + } } \ No newline at end of file diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index 92fb59d85..8a81a03e9 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -14,6 +14,9 @@ }, "box": { "lastUpdate": "Last updated {{seconds}} seconds ago" + }, + "error": { + "missing_user": "Error: User information. Please relogin and try it again" } }, "json_viewer": { @@ -43,6 +46,49 @@ "title": "Configuration" } }, + "add_device": { + "success": "Device successfully added", + "title": "Add New Device", + "error": "An error occurred on save", + "fields": { + "address": { + "label": "IPv4 address", + "placeholder": "172.100.0.1", + "required": "Ipv4 Address is required" + }, + "mne_name": { + "label": "MNE Name", + "placeholder": "Enter MNE name", + "required": "MNE name is required" + }, + "plugin": { + "label": "Plugin", + "placeholder": "Select plugin...", + "required": "Plugin selection is required" + }, + "tls": { + "label": "TLS Enabled" + }, + "credentials": { + "title": "Credentials", + "username": { + "label": "Username", + "placeholder": "Enter username", + "required": "Username is required" + }, + "password": { + "label": "Password", + "placeholder": "Enter password", + "required": "Password is required" + } + } + }, + "buttons": { + "cancel": "Cancel", + "submit": "Add Device", + "loading": "Adding..." + } + }, "table": { "header": { "name": "Name", diff --git a/react-ui/src/shared/api/api.ts b/react-ui/src/shared/api/api.ts index 32969f168..e0f35f0b7 100755 --- a/react-ui/src/shared/api/api.ts +++ b/react-ui/src/shared/api/api.ts @@ -4,6 +4,7 @@ export const addTagTypes = [ 'ConfigurationManagementService', 'AuthService', 'NetworkElementService', + 'PluginInternalService', 'PndService', 'RoleService', 'RoutingTableService', @@ -214,6 +215,18 @@ const injectedRtkApi = api }), invalidatesTags: ['NetworkElementService'], }), + pluginInternalServiceGetAvailablePlugins: build.query< + PluginInternalServiceGetAvailablePluginsApiResponse, + PluginInternalServiceGetAvailablePluginsApiArg + >({ + query: (queryArg) => ({ + url: `/plugins`, + params: { + timestamp: queryArg.timestamp, + }, + }), + providesTags: ['PluginInternalService'], + }), pndServiceGetPnd: build.query< PndServiceGetPndApiResponse, PndServiceGetPndApiArg @@ -680,6 +693,11 @@ export type NetworkElementServiceUpdateApiResponse = export type NetworkElementServiceUpdateApiArg = { networkelementUpdateNetworkElementRequest: TodoChangeNameToFitTheRest } +export type PluginInternalServiceGetAvailablePluginsApiResponse = + /** status 200 A successful response. */ GosdnpluginRegistryGetResponse +export type PluginInternalServiceGetAvailablePluginsApiArg = { + timestamp?: string +} export type PndServiceGetPndApiResponse = /** status 200 A successful response. */ PndGetPndResponse export type PndServiceGetPndApiArg = { @@ -1183,6 +1201,11 @@ export type TodoChangeNameToFitTheRest = { timestamp?: string networkElement?: NetworkelementManagedNetworkElement } +export type GosdnpluginRegistryGetResponse = { + /** Timestamp in nanoseconds since Epoch. */ + timestamp?: string + plugins?: PluginRegistryPlugin[] +} export type PndGetPndResponse = { /** Timestamp in nanoseconds since Epoch. */ timestamp?: string @@ -1432,6 +1455,7 @@ export const { useNetworkElementServiceGetIntendedPathQuery, useNetworkElementServiceGetPathQuery, useNetworkElementServiceUpdateMutation, + usePluginInternalServiceGetAvailablePluginsQuery, usePndServiceGetPndQuery, usePndServiceGetPndListQuery, usePndServiceCreatePndListMutation, diff --git a/react-ui/src/stores/persist.store.ts b/react-ui/src/stores/persist.store.ts index e12467ed9..91d961cad 100755 --- a/react-ui/src/stores/persist.store.ts +++ b/react-ui/src/stores/persist.store.ts @@ -1,4 +1,5 @@ import deviceReducer from '@component/devices/reducer/device.reducer' +import pluginReducer from '@component/devices/reducer/plugin.reducer' import jsonViewerReducer from '@shared/components/json_viewer/reducer/json_viewer.reducer' import routineReducer from '@shared/reducer/routine.reducer' import userReducer from '@shared/reducer/user.reducer' @@ -7,6 +8,8 @@ import { persistReducer } from 'redux-persist' import storage from 'redux-persist/es/storage' import { emptySplitApi } from './api.store' + + /** local storage config */ const rootPersistConfig = { key: 'root', @@ -19,6 +22,7 @@ const rootReducer = combineReducers({ device: deviceReducer, routine: routineReducer, json_viwer: jsonViewerReducer, + plugin: pluginReducer, [emptySplitApi.reducerPath]: emptySplitApi.reducer, }) diff --git a/react-ui/yarn.lock b/react-ui/yarn.lock index 224cc0ddd..5e4047ff1 100755 --- a/react-ui/yarn.lock +++ b/react-ui/yarn.lock @@ -8887,6 +8887,11 @@ react-grid-layout@^1.5.0: react-resizable "^3.0.5" resize-observer-polyfill "^1.5.1" +react-hook-form@^7.54.2: + version "7.54.2" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.54.2.tgz#8c26ed54c71628dff57ccd3c074b1dd377cfb211" + integrity sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg== + react-i18next@^15.0.0: version "15.1.4" resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.1.4.tgz#65c03c31a5e42202000652e163f22f23a9306a60" -- GitLab From 491e2d0d3f055b0b29365f5dcc34e4e7169981ff Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Fri, 7 Feb 2025 11:11:26 +0100 Subject: [PATCH 69/78] remove trailing whitespace --- controller/northbound/server/plugin.go | 1 - 1 file changed, 1 deletion(-) diff --git a/controller/northbound/server/plugin.go b/controller/northbound/server/plugin.go index 8e73994d3..25f4b3cff 100755 --- a/controller/northbound/server/plugin.go +++ b/controller/northbound/server/plugin.go @@ -68,7 +68,6 @@ func (pis *PluginInternalServer) GetAvailablePlugins(ctx context.Context, reques } return pis.pluginRegistryClient.GetAll(ctx, getAllRequest) - } func (pis *PluginInternalServer) GetPluginSchema(request *pipb.GetPluginSchemaRequest, stream pipb.PluginInternalService_GetPluginSchemaServer) error { -- GitLab From 97fffff88025e5635d29ef5fe5c48fd75fdc6706 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 11 Feb 2025 09:12:33 +0000 Subject: [PATCH 70/78] improve login screen See merge request danet/gosdn!1203 Co-authored-by: renovate_bot <group_8045_bot_08826d7c233c44435d2dae5013b96892@noreply.code.fbi.h-da.de> --- .../src/components/login/view/login.view.tsx | 176 ++++++++++-------- .../login/viewmodel/login.viewmodel.ts | 68 ++----- .../shared/components/box/gridBox.view.tsx | 81 ++++---- react-ui/src/shared/style/index.scss | 1 + 4 files changed, 162 insertions(+), 164 deletions(-) diff --git a/react-ui/src/components/login/view/login.view.tsx b/react-ui/src/components/login/view/login.view.tsx index 6b782e877..5b7b40a86 100755 --- a/react-ui/src/components/login/view/login.view.tsx +++ b/react-ui/src/components/login/view/login.view.tsx @@ -1,86 +1,104 @@ -import { BasicProp } from '@shared/types/interfaces.type' -import React, { useRef } from 'react' -import { Alert, Button, Col, Container, Form, Image, Row, Spinner } from 'react-bootstrap' -import { useTranslation } from 'react-i18next' -import useLoginViewModel from '../viewmodel/login.viewmodel' -import './login.scss' -import logo from '/public/logo.svg' +// login.view.tsx +import { BasicProp } from "@shared/types/interfaces.type"; +import React from "react"; +import { + Alert, + Button, + Col, + Container, + Form, + Image, + Row, + Spinner, +} from "react-bootstrap"; +import { useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import useLoginViewModel from "../viewmodel/login.viewmodel"; +import "./login.scss"; +import { LoginFormInputs } from "./login.types"; +import logo from "/public/logo.svg"; -const LoginView: React.FC<BasicProp> = () => { - const { t } = useTranslation('common') - const { login, handleErrorMessageRendering, displayFormFieldChecks, loginLoading } = useLoginViewModel(); +export const LoginView: React.FC<BasicProp> = () => { + const { t } = useTranslation("common"); + const { handleLogin, getErrorMessage, loginLoading } = useLoginViewModel(); - const usernameRef = useRef<HTMLInputElement>(null) - const passwordRef = useRef<HTMLInputElement>(null) + const { + register, + handleSubmit, + formState: { errors }, + } = useForm<LoginFormInputs>({ + mode: "onSubmit", + defaultValues: { + username: "", + password: "", + }, + }); - const triggerLogin = (event: React.FormEvent<HTMLFormElement>) => { - event.preventDefault(); - const username = usernameRef.current!.value; - const password = passwordRef.current!.value; + const invalidForm = ( + <Alert variant="warning">{t("login.form.invalid")}</Alert> + ); + const invalidCredentials = ( + <Alert variant="danger">{t("login.form.failed")}</Alert> + ); - login(username, password); - } + return ( + <Container className="vh-100 d-flex flex-column justify-content-center login-container"> + <Row className="align-items-center"> + <Image src={logo} alt="logo" height={150} /> + </Row> + <Row className="mt-2 justify-content-center"> + <Col md={6} sm={10} className="c-box p-4 bg-white"> + <h1 className="text-center h2">goSDN - Web</h1> - const invalidForm = (<Alert variant="warning">{t('login.form.invalid')}</Alert>) - const invalidCredentials = (<Alert variant="danger">{t('login.form.failed')}</Alert>) + {getErrorMessage(invalidForm, invalidCredentials)} + <Form className="mt-4" onSubmit={handleSubmit(handleLogin)}> + <Form.Group className="mb-3" controlId="loginForm.username"> + <Form.Label>{t("login.form.username.label")}</Form.Label> + <Form.Control + type="text" + isInvalid={!!errors.username} + {...register("username", { + required: t("global.form.empty_field"), + })} + autoComplete="on" + autoFocus={true} + /> + <Form.Control.Feedback type="invalid"> + {errors.username?.message} + </Form.Control.Feedback> + </Form.Group> + <Form.Group className="mb-3" controlId="loginForm.password"> + <Form.Label>{t("login.form.password.label")}</Form.Label> + <Form.Control + type="password" + isInvalid={!!errors.password} + {...register("password", { + required: t("global.form.empty_field"), + })} + /> + <Form.Control.Feedback type="invalid"> + {errors.password?.message} + </Form.Control.Feedback> + </Form.Group> + <Button + variant="primary" + type="submit" + className="w-100 mt-3" + disabled={loginLoading} + > + {t("global.form.submit")} + {loginLoading && ( + <Spinner animation="border" size="sm" role="status"> + <span className="visually-hidden">Loading...</span> + </Spinner> + )} + </Button> + </Form> + </Col> + </Row> + </Container> + ); +}; - return ( - <Container className="vh-100 d-flex flex-column justify-content-center login-container"> - <Row className="align-items-center"> - <Image src={logo} alt="logo" height={150} /> - </Row> - <Row className="mt-2 justify-content-center"> - <Col md={6} sm={10} className="c-box p-4 bg-white"> - <h1 className="text-center h2">goSDN - Web</h1> - - {handleErrorMessageRendering(invalidForm, invalidCredentials)} - - <Form className="mt-4" noValidate validated={displayFormFieldChecks()} onSubmit={triggerLogin}> - <Form.Group - className="mb-3" - controlId="loginForm.username" - > - <Form.Label>{t('login.form.username.label')}</Form.Label> - <Form.Control - type="text" - ref={usernameRef} - required - autoComplete='on' - autoFocus={true} - /> - <Form.Control.Feedback type="invalid"> - {t('global.form.empty_field')} - </Form.Control.Feedback> - </Form.Group> - <Form.Group - className="mb-3" - controlId="loginForm.pasword" - > - <Form.Label>{t('login.form.password.label')}</Form.Label> - <Form.Control type="password" ref={passwordRef} required /> - <Form.Control.Feedback type="invalid"> - {t('global.form.empty_field')} - </Form.Control.Feedback> - </Form.Group> - <Button - variant="primary" - type="submit" - className="w-100 mt-3" - disabled={loginLoading} - > - {t('global.form.submit')} - {loginLoading && - <Spinner animation="border" size="sm" role="status"> - <span className="visually-hidden">Loading...</span> - </Spinner> - } - </Button> - </Form> - </Col> - </Row> - </Container> - ) -} - -export default LoginView +export default LoginView; diff --git a/react-ui/src/components/login/viewmodel/login.viewmodel.ts b/react-ui/src/components/login/viewmodel/login.viewmodel.ts index fabb0a861..9617a117c 100755 --- a/react-ui/src/components/login/viewmodel/login.viewmodel.ts +++ b/react-ui/src/components/login/viewmodel/login.viewmodel.ts @@ -1,65 +1,31 @@ -import { useAuth } from "@provider/auth.provider"; -import { useState } from "react"; - -export interface PageLoginState { - submitted: boolean, - valid: boolean, +export interface LoginFormInputs { + username: string; + password: string; } +// login.viewmodel.ts +import { useAuth } from "@provider/auth.provider"; + export default function useLoginViewModel() { const { login, loginProperties } = useAuth(); const { isLoading: loginLoading, error: loginError, reset: resetLogin } = loginProperties; - const [localFormState, updateLocalFormState] = useState({ - submitted: false, - valid: false, - }); + const handleLogin = async (data: LoginFormInputs) => { + resetLogin(); + await login(data.username, data.password); + }; - const handleErrorMessageRendering = (formInvalidError: JSX.Element, backendResponseError: JSX.Element): JSX.Element | null => { - // backend response check + const getErrorMessage = (formInvalidError: JSX.Element, backendResponseError: JSX.Element): JSX.Element | null => { if (loginError) { return backendResponseError; } - - // form invalid check - if (localFormState.submitted && !localFormState.valid) { - return formInvalidError; - } - return null; - } - - const isFormValid = (username: string | undefined, password: string | undefined): boolean => { - return !!username && !!password; - } - - /** - * Tries to `/login` by using the input fields. - * - * @description The fields are getting validated against null values - * @param event Submit event - */ - const loginHandler = (username: string | undefined, password: string | undefined) => { - resetLogin(); - const valid = isFormValid(username, password); - - updateLocalFormState({ ...localFormState, valid, submitted: true }) - - if (valid) { - //executeLogin(username!, password!); - login(username!, password!); - } - } - - const displayFormFieldChecks = (): boolean => { - return localFormState.submitted && !loginError; - } - + }; return { - displayFormFieldChecks, - login: loginHandler, - handleErrorMessageRendering: handleErrorMessageRendering, + handleLogin, + getErrorMessage, loginLoading, - } -} + loginError + }; +} \ No newline at end of file diff --git a/react-ui/src/shared/components/box/gridBox.view.tsx b/react-ui/src/shared/components/box/gridBox.view.tsx index cc8876100..40da8ada3 100644 --- a/react-ui/src/shared/components/box/gridBox.view.tsx +++ b/react-ui/src/shared/components/box/gridBox.view.tsx @@ -1,39 +1,52 @@ -import { faGripVertical, IconDefinition } from "@fortawesome/free-solid-svg-icons" -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" -import UpdateIndicator from "@layout/grid.layout/update-inidicator.layout/update-indicator.layout" -import { Category, CategoryType } from "@shared/types/category.type" -import { Col, Container, Row } from "react-bootstrap" -import './gridBox.view.scss' +import { + faGripVertical, + IconDefinition, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import UpdateIndicator from "@layout/grid.layout/update-inidicator.layout/update-indicator.layout"; +import { Category, CategoryType } from "@shared/types/category.type"; +import { Col, Container, Row } from "react-bootstrap"; interface GridBoxProps { - title: string, - title_icon: IconDefinition, - children: React.ReactNode, - className?: string, + title: string; + title_icon: IconDefinition; + children: React.ReactNode; + className?: string; } - -export const GridBox: React.FC<GridBoxProps> = ({ children, title, title_icon, className = "" }) => { - return ( - <div className="grid-box h-100"> - <Container fluid className={`c-box d-flex flex-column h-100 ${className}`}> - <div> - <UpdateIndicator - category={Category.DEVICE as CategoryType} - updateInterval={15000} - /> - <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> - <Row className="mb-0"> - <Col xs={12}> - - <h4 className='c-box-title'><FontAwesomeIcon icon={title_icon} size="1x" className="me-2 text-primary" />{title}</h4> - </Col> - </Row> - </div> - <div className="flex-grow-1 content"> - {children} - </div> - </Container> +export const GridBox: React.FC<GridBoxProps> = ({ + children, + title, + title_icon, + className = "", +}) => { + return ( + <div className="grid-box h-100"> + <Container + fluid + className={`c-box d-flex flex-column h-100 ${className}`} + > + <div> + <UpdateIndicator + category={Category.DEVICE as CategoryType} + updateInterval={15000} + /> + <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> + <Row className="mb-0"> + <Col xs={12}> + <h4 className="c-box-title"> + <FontAwesomeIcon + icon={title_icon} + size="1x" + className="me-2 text-primary" + /> + {title} + </h4> + </Col> + </Row> </div> - ) -} \ No newline at end of file + <div className="flex-grow-1 content">{children}</div> + </Container> + </div> + ); +}; diff --git a/react-ui/src/shared/style/index.scss b/react-ui/src/shared/style/index.scss index b70f6c35e..22d919a9a 100755 --- a/react-ui/src/shared/style/index.scss +++ b/react-ui/src/shared/style/index.scss @@ -3,5 +3,6 @@ @import "./utils.scss"; @import "./toast.scss"; @import "./skeleton.scss"; +@import "../components/box/gridBox.view.scss"; @import "/node_modules/react-loading-skeleton/dist/skeleton.css"; -- GitLab From 15b1cfec0bf51065a5999a26482af889a3b123ec Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 11 Feb 2025 14:30:23 +0000 Subject: [PATCH 71/78] (ui): Add custom scroll bar See merge request danet/gosdn!1204 --- react-ui/.prettierrc | 10 +- .../devices/view/boxes/devices.box.view.tsx | 142 ++++++++++++++++++ .../view/boxes/information.box.view.tsx | 112 ++++++++++++++ .../devices/view/device.view.list.tsx | 122 --------------- .../components/devices/view/device.view.tsx | 45 ++---- .../subcomponent/device.view.list-detail.tsx | 87 ----------- .../view_model/device.box.viewmodel.ts | 56 +++++++ ...wmodel.ts => information.box.viewmodel.ts} | 2 +- .../devices/view_model/modal.viewmodel.ts | 13 +- .../src/i18n/locales/en/translations.json | 6 +- .../shared/components/box/gridBox.view.scss | 8 +- .../shared/components/box/gridBox.view.tsx | 93 ++++++------ .../json_viewer/view/json_viewer.view.tsx | 139 ++++++++++------- .../components/scrollbar/Scrollbar.view.tsx | 25 +++ .../components/scrollbar/scrollbar.scss | 50 ++++++ react-ui/src/shared/style/colors.scss | 51 +++---- 16 files changed, 574 insertions(+), 387 deletions(-) create mode 100755 react-ui/src/components/devices/view/boxes/devices.box.view.tsx create mode 100644 react-ui/src/components/devices/view/boxes/information.box.view.tsx delete mode 100755 react-ui/src/components/devices/view/device.view.list.tsx delete mode 100644 react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx create mode 100644 react-ui/src/components/devices/view_model/device.box.viewmodel.ts rename react-ui/src/components/devices/view_model/{device.list.viewmodel.ts => information.box.viewmodel.ts} (97%) create mode 100644 react-ui/src/shared/components/scrollbar/Scrollbar.view.tsx create mode 100644 react-ui/src/shared/components/scrollbar/scrollbar.scss diff --git a/react-ui/.prettierrc b/react-ui/.prettierrc index 7ed67eff4..3a9d4e8fc 100755 --- a/react-ui/.prettierrc +++ b/react-ui/.prettierrc @@ -1,7 +1,11 @@ { "semi": false, "singleQuote": true, - "trailingComma": "es5", + "trailingComma": "all", "tabWidth": 4, - "printWidth": 80 -} + "printWidth": 100, + "bracketSpacing": true, + "arrowParens": "avoid", + "bracketSameLine": true, + "singleAttributePerLine": false +} \ No newline at end of file diff --git a/react-ui/src/components/devices/view/boxes/devices.box.view.tsx b/react-ui/src/components/devices/view/boxes/devices.box.view.tsx new file mode 100755 index 000000000..0204f9707 --- /dev/null +++ b/react-ui/src/components/devices/view/boxes/devices.box.view.tsx @@ -0,0 +1,142 @@ +import { useDeviceBoxViewModel } from '@component/devices/view_model/device.box.viewmodel' +import { faPlus } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { insertMarkTags } from '@helper/text' +import { Scrollbar } from '@shared/components/scrollbar/Scrollbar.view' +import DOMPurify from 'dompurify' +import { RefObject, useCallback } from 'react' +import { Button, Col, Form, OverlayTrigger, Row, Tooltip } from 'react-bootstrap' +import { useTranslation } from 'react-i18next' +import { Device } from '../../reducer/device.reducer' +import AddDeviceModal from '../subcomponent/modal.view' + +export const DeviceList = ({ searchRef }: { searchRef: RefObject<HTMLInputElement> }) => { + const { t } = useTranslation('common') + const { + filteredDevices, + handleItemClick, + selectedDevice, + pnds, + addModal, + openAddModal, + closeModal, + searchValue, + handleSearch, + } = useDeviceBoxViewModel(searchRef) + + const cropUUID = (uuid: string): string => { + return uuid.substring(0, 3) + '...' + uuid.substring(uuid.length - 3, uuid.length) + } + + const renderDeviceItem = useCallback( + (device: Device) => { + const user = pnds.find(pnd => pnd.id === device.pid) + const username = user?.name || '' + const deviceId = device.id! + const croppedId = cropUUID(deviceId) + const devicename = device.name || '' + const isSelected = selectedDevice?.device.id === deviceId + + return ( + <div + key={deviceId} + className={`border-bottom border-primary p-2 transitions ${ + isSelected && 'bg-gradient-fade py-2' + } ${!isSelected && 'text-disabled disabled-hover'}`} + onClick={() => handleItemClick(device)}> + <Row className="align-items-center clickable"> + <Col xs={12} sm={5}> + <span + dangerouslySetInnerHTML={{ + __html: searchValue + ? insertMarkTags(devicename, searchValue) + : DOMPurify.sanitize(devicename), + }} + /> + </Col> + <Col xs={12} sm={3}> + <OverlayTrigger overlay={<Tooltip id={deviceId}>{deviceId}</Tooltip>}> + <span + className="text-gray-500" + dangerouslySetInnerHTML={{ + __html: searchValue + ? insertMarkTags(croppedId, searchValue) + : DOMPurify.sanitize(croppedId), + }} + /> + </OverlayTrigger> + </Col> + <Col xs={12} sm={4}> + <span + className="text-gray-500" + dangerouslySetInnerHTML={{ + __html: searchValue + ? insertMarkTags(username, searchValue) + : DOMPurify.sanitize(username), + }} + /> + </Col> + </Row> + </div> + ) + }, + [selectedDevice, pnds, handleItemClick, searchValue], + ) + + return ( + <div className="d-flex flex-column h-100"> + {/* Fixed top section */} + <div className="flex-shrink-0"> + <Row className="mb-3 align-items-center"> + <Col xs={12} md={6} lg={8}> + <Form.Group controlId="device.search"> + <Form.Control + type="text" + placeholder={t('device.search.placeholder')} + ref={searchRef} + value={searchValue} + onChange={e => handleSearch(e.target.value)} + /> + </Form.Group> + </Col> + <Col xs={12} md={6} lg={4} className="mt-3 mt-md-0 text-md-end"> + <Button + variant="primary::button" + className="btn-primary-button" + onClick={openAddModal}> + <FontAwesomeIcon icon={faPlus} className="me-2" /> + {t('device.add_device_button')} + </Button> + + <AddDeviceModal show={addModal} onHide={closeModal} /> + </Col> + </Row> + </div> + + {/* Scrollable list section */} + <Scrollbar className="flex-grow-1 overflow-y-auto overflow-x-hidden" scrollX={false}> + <div className="rounded border border-primary"> + {/* Fixed header */} + <div className="sticky-top bg-white border-bottom border-primary"> + <Row className="px-2 py-2 mx-0"> + <Col xs={12} sm={5}> + <span className="font-medium">{t('device.table.header.name')}</span> + </Col> + <Col xs={12} sm={3}> + <span className="font-medium">{t('device.table.header.uuid')}</span> + </Col> + <Col xs={12} sm={4}> + <span className="font-medium">{t('device.table.header.user')}</span> + </Col> + </Row> + </div> + + {/* Scrollable content */} + <div className="device-list-content"> + {filteredDevices.map(renderDeviceItem)} + </div> + </div> + </Scrollbar> + </div> + ) +} diff --git a/react-ui/src/components/devices/view/boxes/information.box.view.tsx b/react-ui/src/components/devices/view/boxes/information.box.view.tsx new file mode 100644 index 000000000..6df0e3333 --- /dev/null +++ b/react-ui/src/components/devices/view/boxes/information.box.view.tsx @@ -0,0 +1,112 @@ +import { faChevronDown, faHashtag, faUser } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { insertMarkTags } from '@helper/text' +import { useAppSelector } from '@hooks' +import { JsonViewer } from '@shared/components/json_viewer/view/json_viewer.view' +import DOMPurify from 'dompurify' +import { useCallback, useState } from 'react' +import { Collapse } from 'react-bootstrap' + +interface DeviceListCollapsableProps { + search?: string +} + +enum Collapsables { + Metadata = 1, + Config = 2, +} + +export const DeviceListCollapsable = ({ search }: DeviceListCollapsableProps) => { + const { selected, pnds } = useAppSelector(state => state.device) + + const [collapseable, setCollapsable] = useState<Collapsables | undefined>(undefined) + + const user = pnds.find(pnd => pnd.id === selected?.device.pid) + const username = user?.name || '' + const deviceId = selected?.device.id || '' + const json = selected?.json || {} + + const metadataKey = Object.keys(json).at(2) as keyof typeof json + const metadataObject = (json[metadataKey] as JSON) || {} + + const configKey = Object.keys(json).at(0) as keyof typeof json + const configObject = (json[configKey] as JSON) || {} + + const setCollapsed = useCallback((section: Collapsables) => { + setCollapsable(prev => (prev === section ? undefined : section)) + }, []) + + const renderDeviceInfo = useCallback( + () => ( + <> + <div className="d-flex justify-content-between"> + <div> + <FontAwesomeIcon className="me-2" icon={faHashtag} /> + UUID: + </div> + <span + dangerouslySetInnerHTML={{ + __html: search + ? insertMarkTags(deviceId, search) + : DOMPurify.sanitize(deviceId), + }} + /> + </div> + <div className="d-flex justify-content-between"> + <div> + <FontAwesomeIcon className="me-2" icon={faUser} /> + User: + </div> + <span>{username}</span> + </div> + </> + ), + [deviceId, search, username], + ) + + const renderCollapsableSection = useCallback( + (title: string, section: Collapsables, content: JSON) => ( + <> + <div + className={`d-flex justify-content-between clickable ${ + section === Collapsables.Config + ? 'mt-3' + : 'border-top border-dark mt-3 pt-3' + }`} + aria-expanded={collapseable === section} + onClick={() => setCollapsed(section)}> + <div> + <FontAwesomeIcon + icon={faChevronDown} + rotation={collapseable === section ? undefined : 270} + /> + {title} + </div> + </div> + + <Collapse in={collapseable === section}> + <div id={`collapse-${deviceId}-${section}`}> + {JsonViewer({ + json: content, + options: { + editable: false, + searchEnabled: false, + }, + })} + </div> + </Collapse> + </> + ), + [collapseable, deviceId, setCollapsed], + ) + + return ( + <div id={`collapse-${deviceId}`}> + <div className="pb-4 pt-1 d-flex flex-column gap-1"> + {renderDeviceInfo()} + {renderCollapsableSection('Metadata', Collapsables.Metadata, metadataObject)} + {renderCollapsableSection('Config', Collapsables.Config, configObject)} + </div> + </div> + ) +} diff --git a/react-ui/src/components/devices/view/device.view.list.tsx b/react-ui/src/components/devices/view/device.view.list.tsx deleted file mode 100755 index 868f26959..000000000 --- a/react-ui/src/components/devices/view/device.view.list.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { insertMarkTags } from "@helper/text"; -import { useAppSelector } from "@hooks"; -import DOMPurify from "dompurify"; -import { RefObject, useCallback, useRef } from "react"; -import { Col, OverlayTrigger, Row, Tooltip } from "react-bootstrap"; -import { useTranslation } from "react-i18next"; -import { Device } from "../reducer/device.reducer"; -import { useDeviceTableViewModel } from "../view_model/device.list.viewmodel"; - -const cropUUID = (uuid: string): string => { - return ( - uuid.substring(0, 3) + "..." + uuid.substring(uuid.length - 3, uuid.length) - ); -}; - -export const DeviceList = ({ - searchRef, -}: { - searchRef: RefObject<HTMLInputElement>; -}) => { - const { - devices, - pnds, - selected: selectedDevice, - } = useAppSelector((state) => state.device); - const { t } = useTranslation("common"); - const listRef = useRef<HTMLDivElement>(null); - const { dispatchDevice } = useDeviceTableViewModel(searchRef, listRef); - - const handleItemClick = useCallback((device: Device) => { - dispatchDevice(device); - }, []); - - const getDeviceList = useCallback(() => { - const search = searchRef?.current?.value; - let filtered = devices; - - if (search) { - filtered = devices.filter((device) => { - const user = pnds.find((pnd) => pnd.id === device.pid); - return ( - device.id?.includes(search) || - device.name?.includes(search) || - user?.name?.includes(search) - ); - }); - } - - return filtered.map((device) => { - const user = pnds.find((pnd) => pnd.id === device.pid); - const username = user?.name || ""; - const deviceId = device.id!; - const croppedId = cropUUID(deviceId); - const devicename = device.name || ""; - const isSelected = selectedDevice?.device.id === deviceId; - - return ( - <div - key={deviceId} - className={`border-bottom border-primary p-2 transitions ${isSelected && "bg-gradient-fade py-2"} ${!isSelected && "text-disabled disabled-hover"}`} - onClick={() => handleItemClick(device)} - > - <Row - className="align-items-center clickable" - onClick={() => handleItemClick(device)} - > - <Col xs={12} sm={5}> - <span - dangerouslySetInnerHTML={{ - __html: search - ? insertMarkTags(devicename, search) - : DOMPurify.sanitize(devicename), - }} - /> - </Col> - <Col xs={12} sm={3}> - <OverlayTrigger - overlay={<Tooltip id={deviceId}>{deviceId}</Tooltip>} - > - <span - className="text-gray-500" - dangerouslySetInnerHTML={{ - __html: search - ? insertMarkTags(croppedId, search) - : DOMPurify.sanitize(croppedId), - }} - /> - </OverlayTrigger> - </Col> - <Col xs={12} sm={4}> - <span - className="text-gray-500" - dangerouslySetInnerHTML={{ - __html: search - ? insertMarkTags(username, search) - : DOMPurify.sanitize(username), - }} - /> - </Col> - </Row> - </div> - ); - }); - }, [devices, searchRef, pnds, selectedDevice, handleItemClick]); - - return ( - <div className="rounded border border-primary mt-2"> - <Row className="border-bottom border-primary px-2 py-2 mx-0"> - <Col xs={12} sm={5}> - <span className="font-medium">{t("device.table.header.name")}</span> - </Col> - <Col xs={12} sm={3}> - <span className="font-medium">{t("device.table.header.uuid")}</span> - </Col> - <Col xs={12} sm={4}> - <span className="font-medium">{t("device.table.header.user")}</span> - </Col> - </Row> - <div ref={listRef}>{getDeviceList()}</div> - </div> - ); -}; diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 814f51db1..1328781f5 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,60 +1,33 @@ +// device.view.tsx import { faCircleInfo, - faPlus, faServer, faSliders, } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useAppSelector } from "@hooks"; import { GridLayout } from "@layout/grid.layout/grid.layout"; import { GridBox } from "@shared/components/box/gridBox.view"; import { JsonViewer } from "@shared/components/json_viewer/view/json_viewer.view"; import { useRef } from "react"; -import { Button, Col, Form, Row } from "react-bootstrap"; +import { Col, Row } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { useDeviceViewModel } from "../view_model/device.viewmodel"; +import { DeviceList } from "./boxes/devices.box.view"; +import { DeviceListCollapsable } from "./boxes/information.box.view"; import "./device.scss"; -import { DeviceList } from "./device.view.list"; -import { DeviceListCollapsable } from "./subcomponent/device.view.list-detail"; -import AddDeviceModal from "./subcomponent/modal.view"; const DeviceView = () => { const { t } = useTranslation("common"); const searchRef = useRef<HTMLInputElement>(null); - const { jsonYang, openAddModal, closeModal, addModal } = useDeviceViewModel(); + const { jsonYang } = useDeviceViewModel(); + const { selected } = useAppSelector((root) => root.device); return ( <GridLayout> <> <div key="device-list"> <GridBox title={t("device.box.list.title")} title_icon={faServer}> - <Row className="mb-3 align-items-center"> - <Col xs={12} md={6} lg={8}> - <Form.Group controlId="device.search"> - <Form.Control - type="text" - placeholder={t("device.search.placeholder")} - ref={searchRef} - /> - </Form.Group> - </Col> - <Col xs={12} md={6} lg={4} className="mt-3 mt-md-0 text-md-end"> - <Button - variant="primary::button" - className="btn-primary-button" - onClick={() => openAddModal()} - > - <FontAwesomeIcon icon={faPlus} className="me-2" /> - {t("device.add_device_button")} - </Button> - - <AddDeviceModal show={addModal} onHide={() => closeModal()} /> - </Col> - </Row> - <Row> - <Col xs={12} className="h-auto"> - <DeviceList searchRef={searchRef} /> - </Col> - </Row> + <DeviceList searchRef={searchRef} /> </GridBox> </div> @@ -62,6 +35,7 @@ const DeviceView = () => { <GridBox title={t("device.box.information.title")} title_icon={faCircleInfo} + disabled={!selected?.device} > <Row> <Col xs={12}> @@ -77,6 +51,7 @@ const DeviceView = () => { <GridBox title={t("device.box.configuration.title")} title_icon={faSliders} + disabled={!selected?.device} > <Row> <Col xs={12}>{jsonYang && <JsonViewer json={jsonYang} />}</Col> diff --git a/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx b/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx deleted file mode 100644 index ba146d782..000000000 --- a/react-ui/src/components/devices/view/subcomponent/device.view.list-detail.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { faChevronDown, faHashtag, faUser } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { insertMarkTags } from "@helper/text"; -import { useAppSelector } from "@hooks"; -import { JsonViewer } from "@shared/components/json_viewer/view/json_viewer.view"; -import DOMPurify from 'dompurify'; -import { useState } from "react"; -import { Collapse } from "react-bootstrap"; - -interface DeviceListCollapsableProps { - search?: string, -} - -enum Collapsables { - Metadata = 1, - Config = 2 -} - -export const DeviceListCollapsable = ({ search }: DeviceListCollapsableProps) => { - const { selected } = useAppSelector(state => state.device); - const [collapseable, setCollapsable] = useState<Collapsables | undefined>(undefined) - - const username = selected?.device.name || ""; - const deviceId = selected?.device.id || ""; - const json = selected?.json || {} - - const metadataKey = Object.keys(json).at(2) as keyof typeof json - const metadataObject = json[metadataKey] as JSON || {}; - - const configKey = Object.keys(json).at(0) as keyof typeof json - const configObject = json[configKey] as JSON || {}; - - - const setCollapsed = (prev: Collapsables) => { - const next = collapseable === prev ? undefined : prev; - setCollapsable(next); - } - - return ( - <div id={`collapse-${deviceId}`}> - <div className="pb-4 pt-1 d-flex flex-column gap-1" > - <div className="d-flex justify-content-between"> - <div> - <FontAwesomeIcon className="me-2" icon={faHashtag} /> - UUID: - </div> - <span dangerouslySetInnerHTML={{ - __html: search ? insertMarkTags(deviceId, search) : DOMPurify.sanitize(deviceId) - }} /> - </div> - <div className="d-flex justify-content-between"> - <div> - <FontAwesomeIcon className="me-2" icon={faUser} /> - User: - </div> - <span>{username}</span> - </div> - - <div className="d-flex justify-content-between clickable border-top border-dark mt-3 pt-3" aria-expanded={collapseable === Collapsables.Metadata} onClick={() => setCollapsed(Collapsables.Metadata)}> - <div> - <FontAwesomeIcon icon={faChevronDown} rotation={collapseable === Collapsables.Metadata ? undefined : 270} /> - Metadata - </div> - </div> - - <Collapse in={collapseable === Collapsables.Metadata}> - <div id={`collapse-${deviceId}`}> - {JsonViewer({ json: metadataObject, options: { editable: false, searchEnabled: false } })} - </div> - </Collapse> - - <div className="d-flex justify-content-between clickable mt-3" aria-expanded={collapseable === Collapsables.Config} onClick={() => setCollapsed(Collapsables.Config)}> - <div> - <FontAwesomeIcon icon={faChevronDown} rotation={collapseable === Collapsables.Config ? undefined : 270} /> - Config - </div> - </div> - - <Collapse in={collapseable === Collapsables.Config}> - <div id={`collapse-${deviceId}`}> - {JsonViewer({ json: configObject, options: { editable: false, searchEnabled: false } })} - </div> - </Collapse> - </div> - </div > - ) -} \ No newline at end of file diff --git a/react-ui/src/components/devices/view_model/device.box.viewmodel.ts b/react-ui/src/components/devices/view_model/device.box.viewmodel.ts new file mode 100644 index 000000000..39a4bd051 --- /dev/null +++ b/react-ui/src/components/devices/view_model/device.box.viewmodel.ts @@ -0,0 +1,56 @@ +// devices.box.viewmodel.ts +import { useAppDispatch, useAppSelector } from "@hooks"; +import { RefObject, useCallback, useMemo, useState } from "react"; +import { Device, setSelectedDevice } from "../reducer/device.reducer"; +import { fetchPluginsThunk } from "../routines/plugin.routine"; + +export const useDeviceBoxViewModel = (searchRef: RefObject<HTMLInputElement>) => { + const dispatch = useAppDispatch(); + const { devices, pnds, selected: selectedDevice } = useAppSelector( + (state) => state.device + ); + const [addModal, setAddModal] = useState(false); + const [searchValue, setSearchValue] = useState(""); // Add search state + + const handleSearch = useCallback((value: string) => { + setSearchValue(value); + }, []); + + const handleItemClick = useCallback((device: Device) => { + dispatch(setSelectedDevice({ device })); + }, []); + + const openAddModal = useCallback(() => { + dispatch(fetchPluginsThunk()); + setAddModal(true); + }, []); + + const closeModal = useCallback(() => { + setAddModal(false); + }, []); + + const filteredDevices = useMemo(() => { + if (!searchValue) return devices; + + return devices.filter((device) => { + const user = pnds.find((pnd) => pnd.id === device.pid); + return ( + device.id?.toLowerCase().includes(searchValue.toLowerCase()) || + device.name?.toLowerCase().includes(searchValue.toLowerCase()) || + user?.name?.toLowerCase().includes(searchValue.toLowerCase()) + ); + }); + }, [devices, pnds, searchValue]); // Now depends on searchValue instead of ref + + return { + filteredDevices, + handleItemClick, + selectedDevice, + pnds, + addModal, + openAddModal, + closeModal, + searchValue, + handleSearch, + }; +}; \ No newline at end of file diff --git a/react-ui/src/components/devices/view_model/device.list.viewmodel.ts b/react-ui/src/components/devices/view_model/information.box.viewmodel.ts similarity index 97% rename from react-ui/src/components/devices/view_model/device.list.viewmodel.ts rename to react-ui/src/components/devices/view_model/information.box.viewmodel.ts index 77ba8ddea..546e72086 100755 --- a/react-ui/src/components/devices/view_model/device.list.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/information.box.viewmodel.ts @@ -7,7 +7,7 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "react-toastify"; -export const useDeviceTableViewModel = (searchRef, listRef) => { +export const useInformationViewModel = (searchRef, listRef) => { const [searchTerm, setSearchTerm] = useState(''); const dispatch = useAppDispatch(); const { subscribe } = useMenu(); diff --git a/react-ui/src/components/devices/view_model/modal.viewmodel.ts b/react-ui/src/components/devices/view_model/modal.viewmodel.ts index 98742bd34..f5b12bec5 100644 --- a/react-ui/src/components/devices/view_model/modal.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/modal.viewmodel.ts @@ -1,6 +1,6 @@ import { NetworkelementAddListRequest, NetworkelementSetMne, useNetworkElementServiceAddListMutation } from "@api/api"; import { useAppDispatch, useAppSelector } from "@hooks"; -import { fetchUser } from "@shared/routine/user.routine"; +import { fetchPnds, fetchUser } from "@shared/routine/user.routine"; import { useState } from "react"; import { SubmitHandler, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; @@ -42,7 +42,12 @@ export const useModalViewModel = ({ hide }: ModalViewModelType) => { const { user } = useAppSelector(state => state.user); const reset = () => { resetModal(); hide(); } - const success = () => { toast.success(t('device.add_device.success')); reset(); dispatch(fetchUser()) } + const success = () => { + toast.success(t('device.add_device.success')); + reset(); + dispatch(fetchPnds()) + dispatch(fetchUser()) + } const onSubmit: SubmitHandler<FormData> = async (data) => { @@ -57,7 +62,7 @@ export const useModalViewModel = ({ hide }: ModalViewModelType) => { } } - if (!user?.id) { + if (!user?.id || !user?.roles) { toast.error("global.error.missing_user") return } @@ -65,7 +70,7 @@ export const useModalViewModel = ({ hide }: ModalViewModelType) => { const request: NetworkelementAddListRequest = { timestamp: Date.now().toString(), mne: [mne], - pid: user.id + pid: Object.keys(user.roles)[0] }; try { diff --git a/react-ui/src/i18n/locales/en/translations.json b/react-ui/src/i18n/locales/en/translations.json index 8a81a03e9..8c4b56dcd 100755 --- a/react-ui/src/i18n/locales/en/translations.json +++ b/react-ui/src/i18n/locales/en/translations.json @@ -12,9 +12,6 @@ "menu_item": { "logout": "Logout" }, - "box": { - "lastUpdate": "Last updated {{seconds}} seconds ago" - }, "error": { "missing_user": "Error: User information. Please relogin and try it again" } @@ -44,7 +41,8 @@ }, "configuration": { "title": "Configuration" - } + }, + "lastUpdate": "Last updated {{seconds}} seconds ago" }, "add_device": { "success": "Device successfully added", diff --git a/react-ui/src/shared/components/box/gridBox.view.scss b/react-ui/src/shared/components/box/gridBox.view.scss index f247f654c..38d6f9f3b 100644 --- a/react-ui/src/shared/components/box/gridBox.view.scss +++ b/react-ui/src/shared/components/box/gridBox.view.scss @@ -25,7 +25,7 @@ $transition-duration: 0.3s; background-color: white; position: relative; transition: box-shadow $transition-duration ease-in-out; - @extend .border-gradient; + @extend .rounded; box-shadow: $box-shadow; @@ -36,6 +36,12 @@ $transition-duration: 0.3s; opacity: 1; } } + + &.disabled { + box-shadow: 0 0.5rem 1rem rgba(map-get($theme-colors, "disabled"), 0.2); + @extend .border-gradient-disabled; + } + @extend .border-gradient-primary; } .c-box-title { diff --git a/react-ui/src/shared/components/box/gridBox.view.tsx b/react-ui/src/shared/components/box/gridBox.view.tsx index 40da8ada3..0e3b0bffe 100644 --- a/react-ui/src/shared/components/box/gridBox.view.tsx +++ b/react-ui/src/shared/components/box/gridBox.view.tsx @@ -1,52 +1,55 @@ -import { - faGripVertical, - IconDefinition, -} from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import UpdateIndicator from "@layout/grid.layout/update-inidicator.layout/update-indicator.layout"; -import { Category, CategoryType } from "@shared/types/category.type"; -import { Col, Container, Row } from "react-bootstrap"; +import { faGripVertical, IconDefinition } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import UpdateIndicator from '@layout/grid.layout/update-inidicator.layout/update-indicator.layout' +import { Category, CategoryType } from '@shared/types/category.type' +import { Col, Container, Row } from 'react-bootstrap' +import { Scrollbar } from '../scrollbar/Scrollbar.view' interface GridBoxProps { - title: string; - title_icon: IconDefinition; - children: React.ReactNode; - className?: string; + title: string + title_icon: IconDefinition + children: React.ReactNode + className?: string + disabled?: boolean } export const GridBox: React.FC<GridBoxProps> = ({ - children, - title, - title_icon, - className = "", + children, + title, + title_icon, + className = '', + disabled = false, }) => { - return ( - <div className="grid-box h-100"> - <Container - fluid - className={`c-box d-flex flex-column h-100 ${className}`} - > - <div> - <UpdateIndicator - category={Category.DEVICE as CategoryType} - updateInterval={15000} - /> - <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> - <Row className="mb-0"> - <Col xs={12}> - <h4 className="c-box-title"> - <FontAwesomeIcon - icon={title_icon} - size="1x" - className="me-2 text-primary" - /> - {title} - </h4> - </Col> - </Row> + return ( + <div className="grid-box h-100"> + <Container + fluid + className={`c-box d-flex ${disabled && 'text-disabled disabled'} flex-column h-100 ${className}`}> + <div> + {!disabled && ( + <UpdateIndicator + category={Category.DEVICE as CategoryType} + updateInterval={15000} + /> + )} + <FontAwesomeIcon icon={faGripVertical} className="drag-handle" /> + <Row className="mb-0"> + <Col xs={12}> + <h4 className={`c-box-title ${disabled && 'text-disabled'}`}> + <FontAwesomeIcon + icon={title_icon} + size="1x" + className={`me-2 ${disabled ? 'text-disabled' : 'text-primary'}`} + /> + {title} + </h4> + </Col> + </Row> + </div> + <Scrollbar scrollX={false} className="flex-grow-1 content"> + {children} + </Scrollbar> + </Container> </div> - <div className="flex-grow-1 content">{children}</div> - </Container> - </div> - ); -}; + ) +} diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx index b2f409c17..02a08978c 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.view.tsx @@ -1,62 +1,79 @@ -import { faAlignRight, faPenToSquare, faTrashCan } from "@fortawesome/free-solid-svg-icons" -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" -import { insertMarkTags } from "@helper/text" +import { faAlignRight, faPenToSquare, faTrashCan } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { insertMarkTags } from '@helper/text' import DOMPurify from 'dompurify' -import React, { Suspense, useMemo, useRef } from "react" -import { Form, Table } from "react-bootstrap" -import { useTranslation } from "react-i18next" +import React, { Suspense, useMemo, useRef } from 'react' +import { Form, Table } from 'react-bootstrap' +import { useTranslation } from 'react-i18next' import Skeleton from 'react-loading-skeleton' -import { useJsonViewer } from "../viewmodel/json_viewer.viewmodel" +import { useJsonViewer } from '../viewmodel/json_viewer.viewmodel' import './json_viewer.scss' - type JsonViewerProbs = { - json: JSON, + json: JSON options?: { searchEnabled?: boolean editable?: boolean } } -export const JsonViewer = ({ json, options = { searchEnabled: true, editable: true } }: JsonViewerProbs) => { - const { t } = useTranslation('common'); - const htmlContainer = useRef(null); - const search = useRef<HTMLInputElement>(null); - - const { getSubset, isCollapsed, collapseable, collapse, parameterizedJson, searchTerm } = useJsonViewer({ json, search, container: htmlContainer }); - - const renderInner = (innerJson: JSON, nested: number = 0, parentKey: string = "", path: string = "/network-instance/0/"): JSX.Element => { - path += parentKey + (parentKey === "" ? "" : "/") +export const JsonViewer = ({ + json, + options = { searchEnabled: true, editable: true }, +}: JsonViewerProbs) => { + const { t } = useTranslation('common') + const htmlContainer = useRef(null) + const search = useRef<HTMLInputElement>(null) + + const { getSubset, isCollapsed, collapseable, collapse, parameterizedJson, searchTerm } = + useJsonViewer({ json, search, container: htmlContainer }) + + const renderInner = ( + innerJson: JSON, + nested: number = 0, + parentKey: string = '', + path: string = '/network-instance/0/', + ): JSX.Element => { + path += parentKey + (parentKey === '' ? '' : '/') if (Object.entries(innerJson).length === 0) { - return <tr><td><Skeleton count={3}></Skeleton></td></tr> + return ( + <tr> + <td> + <Skeleton count={3}></Skeleton> + </td> + </tr> + ) } return Object.entries(innerJson).map(([key, child]): JSX.Element => { - let collapsed = isCollapsed(key, nested); + let collapsed = isCollapsed(key, nested) // display only keys and values that matches - if (searchTerm !== "") { + if (searchTerm !== '') { const foundPaths = parameterizedJson.current.filter(_path => _path === path) //collapsed = !collapsed ? !!foundPaths.length : collapsed collapsed = !!foundPaths.length } - const isObject = child instanceof Object; - let readableValue: string = isObject ? '' : DOMPurify.sanitize(child); + const isObject = child instanceof Object + let readableValue: string = isObject ? '' : DOMPurify.sanitize(child) - if (searchTerm !== "" && readableValue.includes(searchTerm)) { + if (searchTerm !== '' && readableValue.includes(searchTerm)) { readableValue = insertMarkTags(readableValue, searchTerm) } - const icon = isObject ? - <span className={collapsed ? 'fa-rotate-90' : ''}>></span> : <FontAwesomeIcon className="icon fa-rotate-180" icon={faAlignRight} size="xs" /> + const icon = isObject ? ( + <span className={collapsed ? 'fa-rotate-90' : ''}>></span> + ) : ( + <FontAwesomeIcon className="icon fa-rotate-180" icon={faAlignRight} size="xs" /> + ) // determine the margin-left: n indent - let tabs = 0.0; + let tabs = 0.0 for (let i = 0; i < nested; i++) { - tabs += 0.4; + tabs += 0.4 } let concatenatedKey = key @@ -69,30 +86,45 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr concatenatedKey = DOMPurify.sanitize(concatenatedKey) - if (searchTerm !== "" && concatenatedKey.includes(searchTerm)) { + if (searchTerm !== '' && concatenatedKey.includes(searchTerm)) { concatenatedKey = insertMarkTags(concatenatedKey, searchTerm) } return ( <React.Fragment key={`${nested}-${key}`}> <tr - className={"list-item-td " + key + " " + nested + " " + (isObject ? 'object' : '')} + className={ + 'list-item-td ' + key + ' ' + nested + ' ' + (isObject ? 'object' : '') + } data-copy-value={readableValue} - onClick={() => { isObject ? collapse(key, nested, child) : null }} - > - <td style={{ marginLeft: tabs + 'em' }} className={"d-flex align-items-center "}>{icon}<span> <span dangerouslySetInnerHTML={{ __html: concatenatedKey }} /></span></td> - <td className="text-element text-truncate" dangerouslySetInnerHTML={{ __html: readableValue }}></td> - {options?.editable && + onClick={() => { + isObject ? collapse(key, nested, child) : null + }}> + <td + style={{ marginLeft: tabs + 'em' }} + className={'d-flex align-items-center '}> + {icon} + <span> +   + <span dangerouslySetInnerHTML={{ __html: concatenatedKey }} /> + </span> + </td> + <td + className="text-element text-truncate" + dangerouslySetInnerHTML={{ __html: readableValue }}></td> + {options?.editable && ( <td className="text-end"> <div className="d-flex icons justify-content-end align-items-center"> <FontAwesomeIcon icon={faPenToSquare} size="sm" /> <FontAwesomeIcon icon={faTrashCan} size="sm" /> </div> </td> - } - </tr > - {isObject && collapsed && renderInner(innerChild, nested + 1, concatenatedKey, path)} - </React.Fragment > + )} + </tr> + {isObject && + collapsed && + renderInner(innerChild, nested + 1, concatenatedKey, path)} + </React.Fragment> ) }) } @@ -100,31 +132,24 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr const renderJson = (json: JSON): JSX.Element => { return ( <Table className="m-0 p-0 list-unstyled"> - <tbody> - { - renderInner(json) - } - </tbody> - </Table > + <tbody>{renderInner(json)}</tbody> + </Table> ) } - const Hierarchy = useMemo(() => { - const subset = getSubset(json); - return ( - <Suspense> - {renderJson(subset)} - </Suspense> - ) + const subset = getSubset(json) + return <Suspense>{renderJson(subset)}</Suspense> }, [json, collapseable, searchTerm]) - - const Search = (): React.ReactElement => { return ( - <Form.Group controlId='json_viewer.search' className='p-0 '> - <Form.Control type="text" placeholder={t('device.search.placeholder')} ref={search} /> + <Form.Group controlId="json_viewer.search" className="p-0 "> + <Form.Control + type="text" + placeholder={t('device.search.placeholder')} + ref={search} + /> </Form.Group> ) } @@ -135,4 +160,4 @@ export const JsonViewer = ({ json, options = { searchEnabled: true, editable: tr {Hierarchy} </div> ) -} \ No newline at end of file +} diff --git a/react-ui/src/shared/components/scrollbar/Scrollbar.view.tsx b/react-ui/src/shared/components/scrollbar/Scrollbar.view.tsx new file mode 100644 index 000000000..16191c32f --- /dev/null +++ b/react-ui/src/shared/components/scrollbar/Scrollbar.view.tsx @@ -0,0 +1,25 @@ +import './scrollbar.scss' + +export const Scrollbar = ({ children, className = '', scrollX = true, scrollY = true }) => { + // Determine overflow classes based on scroll options + const getOverflowClass = () => { + if (scrollX && scrollY) return 'overflow-auto' + if (scrollX) return 'overflow-x-auto overflow-y-hidden' + if (scrollY) return 'overflow-y-auto overflow-x-hidden' + return 'overflow-hidden' + } + + // Determine scroll direction classes + const getScrollDirectionClass = () => { + const classes = ['scrollable-content'] + if (scrollX) classes.push('scroll-x') + if (scrollY) classes.push('scroll-y') + return classes.join(' ') + } + + return ( + <div className={`custom-scrollbar position-relative h-100 overflow-hidden ${className}`}> + <div className={`${getScrollDirectionClass()} ${getOverflowClass()}`}>{children}</div> + </div> + ) +} diff --git a/react-ui/src/shared/components/scrollbar/scrollbar.scss b/react-ui/src/shared/components/scrollbar/scrollbar.scss new file mode 100644 index 000000000..5fb481933 --- /dev/null +++ b/react-ui/src/shared/components/scrollbar/scrollbar.scss @@ -0,0 +1,50 @@ +@import "/src/shared/style/colors.scss"; + +// Import or reference to your theme variables +$scrollbar-width: 6px; +$scrollbar-track-bg: rgba(grey, 0.1); +$scrollbar-thumb-bg: map-get($theme-colors, "black"); +$scrollbar-thumb-hover-bg: map-get($theme-colors, "primary-hover"); + +.custom-scrollbar { + --scrollbar-width: #{$scrollbar-width}; + --scrollbar-track-bg: #{$scrollbar-track-bg}; + --scrollbar-thumb-bg: #{$scrollbar-thumb-bg}; + --scrollbar-thumb-hover-bg: #{$scrollbar-thumb-hover-bg}; + + .scrollable-content { + height: 100%; + width: 100%; + + // Padding and margin for scrollbars + &.scroll-y { + padding-right: calc(#{$scrollbar-width} + 4px); + margin-right: calc(#{$scrollbar-width} * -1); + } + + &.scroll-x { + padding-bottom: calc(#{$scrollbar-width} + 4px); + margin-bottom: calc(#{$scrollbar-width} * -1); + } + + // Webkit scrollbar styles + &::-webkit-scrollbar { + width: $scrollbar-width; + height: $scrollbar-width; + } + + &::-webkit-scrollbar-track { + background: $scrollbar-track-bg; + } + + &::-webkit-scrollbar-thumb { + background-color: $scrollbar-thumb-hover-bg; + border-radius: calc(#{$scrollbar-width} / 2); + transition: background-color 0.2s ease-in-out; + } + + // Firefox scrollbar styles + scrollbar-width: thin; + scrollbar-color: $scrollbar-thumb-hover-bg $scrollbar-track-bg; + } +} diff --git a/react-ui/src/shared/style/colors.scss b/react-ui/src/shared/style/colors.scss index 9ba6ce0c0..1b567b7c6 100755 --- a/react-ui/src/shared/style/colors.scss +++ b/react-ui/src/shared/style/colors.scss @@ -16,35 +16,30 @@ $transition-duration: 0.3s; @import "/node_modules/bootstrap/scss/bootstrap"; // Gradients +$gradient-colors: ( + "primary": map-get($theme-colors, "primary"), + "disabled": map-get($theme-colors, "disabled") +); -.border-gradient { - background: - linear-gradient(white, white) padding-box, - linear-gradient( - 180deg, - rgba(map-get($theme-colors, "primary"), 0.4) 0%, - rgba(map-get($theme-colors, "primary"), 0.2) 40%, - rgba(map-get($theme-colors, "primary"), 0.1) 100% - ) - border-box; - border: $border-width solid transparent; +@each $name, $color in $gradient-colors { + .border-gradient-#{$name} { + background: + linear-gradient(white, white) padding-box, + linear-gradient(180deg, rgba($color, 0.4) 0%, rgba($color, 0.2) 40%, rgba($color, 0.1) 100%) border-box; + border: $border-width solid transparent; - &::before { - content: ""; - position: absolute; - top: -$border-width; - left: -$border-width; - right: -$border-width; - bottom: -$border-width; - background: linear-gradient( - 180deg, - rgba(map-get($theme-colors, "primary"), 0.4) 0%, - rgba(map-get($theme-colors, "primary"), 0.2) 60%, - rgba(map-get($theme-colors, "primary"), 0.1) 100% - ); - border-radius: inherit; - z-index: -1; - opacity: 0; - transition: opacity $transition-duration ease-in-out; + &::before { + content: ""; + position: absolute; + top: -$border-width; + left: -$border-width; + right: -$border-width; + bottom: -$border-width; + background: linear-gradient(180deg, rgba($color, 0.4) 0%, rgba($color, 0.2) 60%, rgba($color, 0.1) 100%); + border-radius: inherit; + z-index: -1; + opacity: 0; + transition: opacity $transition-duration ease-in-out; + } } } -- GitLab From 67825c403313e7e2b645bd67e004e5f02ddcbc4c Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Tue, 11 Feb 2025 16:19:21 +0100 Subject: [PATCH 72/78] (ui): revert permission change --- .cobra.yaml | 0 .devcontainer/Dockerfile | 0 .devcontainer/devcontainer.json | 0 .dockerignore | 0 .editorconfig | 0 .gitignore | 0 .gitlab-ci.yml | 0 .gitlab/ci/.build-binaries.yml | 0 .gitlab/ci/.build-container-images.yml | 0 .gitlab/ci/.code-quality-ci.yml | 0 .gitlab/ci/.mk-docs-deploy.yml | 0 .gitlab/ci/.react-ui.yml | 3 - .gitlab/ci/.release-container.yml | 0 .gitlab/ci/.renovate.yml | 0 .gitlab/ci/.security-and-compliance-ci.yml | 0 .gitlab/ci/.test.yml | 0 .gitlab/ci/gnmi-cert-integration.Dockerfile | 0 .gitlab/ci/gosdn-integration.Dockerfile | 0 .gitlab/ci/legacy/.test.yml | 0 .gitlab/issue_templates/Change Request.md | 0 .gitlab/issue_templates/Feature Proposal.md | 0 .gitlab/issue_templates/Issue Template.md | 0 .gitlab/merge_request_templates/Default.md | 0 .gitmodules | 0 .golangci.yml | 0 LICENSE | 0 Makefile | 0 README.md | 0 api/LICENSE | 0 api/Makefile | 0 api/README.md | 0 api/buf.gen.yaml | 0 api/buf.work.yaml | 0 api/cmd/gogen.go | 0 api/deps/buf.yaml | 0 .../.github/workflows/ci-cpp-build-gnmi.yml | 0 .../github.com/openconfig/gnmi/BUILD.bazel | 0 .../openconfig/gnmi/CONTRIBUTING.md | 0 api/deps/github.com/openconfig/gnmi/LICENSE | 0 api/deps/github.com/openconfig/gnmi/README.md | 0 .../openconfig/gnmi/WORKSPACE.bazel | 0 .../github.com/openconfig/gnmi/cache/cache.go | 0 .../openconfig/gnmi/cache/cache_test.go | 0 .../github.com/openconfig/gnmi/cli/cli.go | 0 .../openconfig/gnmi/cli/cli_test.go | 0 .../openconfig/gnmi/client/cache.go | 0 .../openconfig/gnmi/client/cache_test.go | 0 .../openconfig/gnmi/client/client.go | 0 .../openconfig/gnmi/client/client_test.go | 0 .../openconfig/gnmi/client/fake/fake.go | 0 .../openconfig/gnmi/client/fake/fake_test.go | 0 .../gnmi/client/flags/flags_test.go | 0 .../openconfig/gnmi/client/flags/intmap.go | 0 .../gnmi/client/flags/stringlist.go | 0 .../openconfig/gnmi/client/flags/stringmap.go | 0 .../openconfig/gnmi/client/gnmi/client.go | 0 .../gnmi/client/gnmi/client_test.go | 0 .../gnmi/client/gnmi/credentials.go | 0 .../openconfig/gnmi/client/grpcutil/lookup.go | 0 .../gnmi/client/grpcutil/lookup_test.go | 0 .../openconfig/gnmi/client/notification.go | 0 .../openconfig/gnmi/client/query.go | 0 .../openconfig/gnmi/client/reconnect.go | 0 .../openconfig/gnmi/client/reconnect_test.go | 0 .../openconfig/gnmi/client/register.go | 0 .../openconfig/gnmi/client/values.go | 0 .../openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go | 0 .../gnmi/cmd/gnmi_cli/gnmi_cli_test.go | 0 .../gnmi/cmd/gnmi_collector/docker/Dockerfile | 0 .../gnmi/cmd/gnmi_collector/docker/README.md | 0 .../cmd/gnmi_collector/docker/config/cert.pem | 0 .../gnmi_collector/docker/config/example.cfg | 0 .../cmd/gnmi_collector/docker/config/key.pem | 0 .../gnmi_collector/docker/supervisord.conf | 0 .../gnmi/cmd/gnmi_collector/gnmi_collector.go | 0 .../cmd/gnmi_collector/gnmi_collector_test.go | 0 .../gnmi/cmd/gnmi_collector/testdata/bad.cfg | 0 .../gnmi/cmd/gnmi_collector/testdata/bad.crt | 0 .../gnmi/cmd/gnmi_collector/testdata/bad.key | 0 .../gnmi/cmd/gnmi_collector/testdata/good.cfg | 0 .../gnmi/cmd/gnmi_collector/testdata/good.crt | 0 .../gnmi/cmd/gnmi_collector/testdata/good.key | 0 .../gnmi_collector/testdata/unparseable.cfg | 0 .../openconfig/gnmi/coalesce/coalesce.go | 0 .../openconfig/gnmi/coalesce/coalesce_test.go | 0 .../openconfig/gnmi/collector/collector.go | 0 .../gnmi/collector/collector_test.go | 0 .../openconfig/gnmi/connection/connection.go | 0 .../gnmi/connection/connection_test.go | 0 .../github.com/openconfig/gnmi/ctree/tree.go | 0 .../openconfig/gnmi/ctree/tree_test.go | 0 .../openconfig/gnmi/errdiff/errdiff.go | 0 .../openconfig/gnmi/errdiff/errdiff_test.go | 0 .../openconfig/gnmi/errlist/errlist.go | 0 .../openconfig/gnmi/errlist/errlist_test.go | 0 .../github.com/openconfig/gnmi/gnmi_deps.bzl | 0 api/deps/github.com/openconfig/gnmi/go.mod | 0 api/deps/github.com/openconfig/gnmi/go.sum | 0 .../openconfig/gnmi/latency/latency.go | 0 .../openconfig/gnmi/latency/latency_test.go | 0 .../openconfig/gnmi/manager/manager.go | 0 .../openconfig/gnmi/manager/manager_test.go | 0 .../openconfig/gnmi/manager/meta.go | 0 .../openconfig/gnmi/manager/meta_test.go | 0 .../github.com/openconfig/gnmi/match/match.go | 0 .../openconfig/gnmi/match/match_test.go | 0 .../openconfig/gnmi/metadata/metadata.go | 0 .../openconfig/gnmi/metadata/metadata_test.go | 0 .../yang/gnmi-collector-metadata.yang | 0 .../github.com/openconfig/gnmi/path/path.go | 0 .../openconfig/gnmi/path/path_test.go | 0 .../gnmi/proto/collector/BUILD.bazel | 0 .../gnmi/proto/collector/collector.pb.go | 0 .../gnmi/proto/collector/collector.proto | 0 .../gnmi/proto/collector/collector_grpc.pb.go | 0 .../gnmi/proto/collector/collector_pb2.py | 0 .../proto/collector/collector_pb2_grpc.py | 0 .../openconfig/gnmi/proto/gnmi/BUILD.bazel | 0 .../openconfig/gnmi/proto/gnmi/gnmi.pb.go | 0 .../openconfig/gnmi/proto/gnmi/gnmi.proto | 0 .../gnmi/proto/gnmi/gnmi_grpc.pb.go | 0 .../openconfig/gnmi/proto/gnmi/gnmi_pb2.py | 0 .../gnmi/proto/gnmi/gnmi_pb2_grpc.py | 0 .../gnmi/proto/gnmi_ext/BUILD.bazel | 0 .../gnmi/proto/gnmi_ext/gnmi_ext.pb.go | 0 .../gnmi/proto/gnmi_ext/gnmi_ext.proto | 0 .../gnmi/proto/gnmi_ext/gnmi_ext_pb2.py | 0 .../gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py | 0 .../openconfig/gnmi/proto/target/BUILD.bazel | 0 .../openconfig/gnmi/proto/target/target.pb.go | 0 .../openconfig/gnmi/proto/target/target.proto | 0 .../gnmi/proto/target/target_pb2.py | 0 .../gnmi/proto/target/target_pb2_grpc.py | 0 .../openconfig/gnmi/subscribe/subscribe.go | 0 .../gnmi/subscribe/subscribe_test.go | 0 .../openconfig/gnmi/target/target.go | 0 .../openconfig/gnmi/target/target_test.go | 0 .../gnmi/testing/fake/gnmi/agent.go | 0 .../gnmi/testing/fake/gnmi/client.go | 0 .../fake/gnmi/cmd/fake_server/README.md | 0 .../fake/gnmi/cmd/fake_server/config.pb.txt | 0 .../fake/gnmi/cmd/fake_server/server.go | 0 .../gnmi/cmd/gen_fake_config/gen_config.go | 0 .../gnmi/testing/fake/gnmi/gnmi_test.go | 0 .../gnmi/testing/fake/proto/fake.pb.go | 0 .../gnmi/testing/fake/proto/fake.proto | 0 .../gnmi/testing/fake/proto/fake_grpc.pb.go | 0 .../gnmi/testing/fake/proto/fake_pb2.py | 0 .../gnmi/testing/fake/proto/fake_pb2_grpc.py | 0 .../gnmi/testing/fake/queue/fixed_queue.go | 0 .../gnmi/testing/fake/queue/queue.go | 0 .../gnmi/testing/fake/queue/queue_test.go | 0 .../fake/testing/grpc/config/config_test.go | 0 .../fake/testing/grpc/config/server_option.go | 0 .../gnmi/testing/fake/testing/tls/tls.go | 0 .../gnmi/testing/fake/testing/tls/tls_test.go | 0 .../github.com/openconfig/gnmi/value/value.go | 0 .../openconfig/gnmi/value/value_test.go | 0 .../github.com/openconfig/gnmi/watch/watch.go | 0 .../gnmi/proto/collector/collector.pb.go | 0 .../gnmi/proto/collector/collector_grpc.pb.go | 0 .../openconfig/gnmi/proto/gnmi/gnmi.pb.go | 0 .../gnmi/proto/gnmi/gnmi_grpc.pb.go | 0 .../gnmi/proto/gnmi_ext/gnmi_ext.pb.go | 0 .../openconfig/gnmi/proto/target/target.pb.go | 0 .../gnmi/testing/fake/proto/fake.pb.go | 0 .../gnmi/testing/fake/proto/fake_grpc.pb.go | 0 api/go/gosdn/app/app.pb.go | 0 api/go/gosdn/app/app.pb.gw.go | 0 api/go/gosdn/app/app_grpc.pb.go | 0 .../configurationmanagement.pb.go | 0 .../configurationmanagement.pb.gw.go | 0 .../configurationmanagement_grpc.pb.go | 0 api/go/gosdn/conflict/conflict.pb.go | 0 api/go/gosdn/csbi/csbi.pb.go | 0 api/go/gosdn/csbi/csbi_grpc.pb.go | 0 .../gosdn/networkelement/networkelement.pb.go | 0 .../networkelement/networkelement.pb.gw.go | 0 .../networkelement/networkelement_grpc.pb.go | 0 .../plugin-internal/plugin-internal.pb.go | 0 .../plugin-internal_grpc.pb.go | 0 .../plugin-registry/plugin-registry.pb.go | 0 .../plugin-registry_grpc.pb.go | 0 api/go/gosdn/plugin/plugin.pb.go | 0 api/go/gosdn/plugin/plugin_grpc.pb.go | 0 api/go/gosdn/pnd/pnd.pb.go | 0 api/go/gosdn/pnd/pnd.pb.gw.go | 0 api/go/gosdn/pnd/pnd_grpc.pb.go | 0 api/go/gosdn/rbac/rbac.pb.go | 0 api/go/gosdn/rbac/rbac.pb.gw.go | 0 api/go/gosdn/rbac/rbac_grpc.pb.go | 0 api/go/gosdn/rbac/role.pb.go | 0 api/go/gosdn/rbac/role.pb.gw.go | 0 api/go/gosdn/rbac/role_grpc.pb.go | 0 api/go/gosdn/rbac/user.pb.go | 0 api/go/gosdn/rbac/user.pb.gw.go | 0 api/go/gosdn/rbac/user_grpc.pb.go | 0 api/go/gosdn/southbound/southbound.pb.go | 0 api/go/gosdn/southbound/southbound_grpc.pb.go | 0 .../subscriptionmanagement.pb.go | 0 .../subscriptionmanagement.pb.gw.go | 0 .../subscriptionmanagement_grpc.pb.go | 0 api/go/gosdn/topology/link.pb.go | 0 api/go/gosdn/topology/node.pb.go | 0 api/go/gosdn/topology/port.pb.go | 0 api/go/gosdn/topology/route.pb.go | 0 api/go/gosdn/topology/routingTable.pb.go | 0 api/go/gosdn/topology/routingTable.pb.gw.go | 0 api/go/gosdn/topology/routingTable_grpc.pb.go | 0 api/go/gosdn/topology/topology.pb.go | 0 api/go/gosdn/topology/topology.pb.gw.go | 0 api/go/gosdn/topology/topology_grpc.pb.go | 0 api/go/gosdn/transport/transport.pb.go | 0 api/openapiv2/gosdn_northbound.swagger.json | 0 api/proto/buf.lock | 0 api/proto/buf.yaml | 0 api/proto/gosdn/app/app.proto | 0 .../configurationmanagement.proto | 0 api/proto/gosdn/conflict/conflict.proto | 0 api/proto/gosdn/csbi/csbi.proto | 0 .../gosdn/networkelement/networkelement.proto | 0 .../plugin-internal/plugin-internal.proto | 0 .../plugin-registry/plugin-registry.proto | 0 api/proto/gosdn/plugin/plugin.proto | 0 api/proto/gosdn/pnd/pnd.proto | 0 api/proto/gosdn/rbac/rbac.proto | 0 api/proto/gosdn/rbac/role.proto | 0 api/proto/gosdn/rbac/user.proto | 0 api/proto/gosdn/southbound/southbound.proto | 0 .../subscriptionmanagement.proto | 0 api/proto/gosdn/topology/link.proto | 0 api/proto/gosdn/topology/node.proto | 0 api/proto/gosdn/topology/port.proto | 0 api/proto/gosdn/topology/route.proto | 0 api/proto/gosdn/topology/routingTable.proto | 0 api/proto/gosdn/topology/topology.proto | 0 api/proto/gosdn/transport/transport.proto | 0 api/third_party/validator/validator.proto | 0 application-framework/event/event.go | 0 application-framework/event/eventService.go | 0 application-framework/event/event_test.go | 0 application-framework/event/topics.go | 0 application-framework/event/type.go | 0 .../models/model-handling.go | 0 .../models/model-handling_test.go | 0 .../registration/registration.go | 0 applications/arista-routing-engine/app.go | 0 .../arista-routing-engine.Dockerfile | 0 ...sta-routing-engine.Dockerfile.dockerignore | 0 applications/arista-routing-engine/main.go | 0 .../arista-routing-engine/network-element.go | 0 applications/arista-routing-engine/routing.go | 0 .../basic-interface-monitoring/app.go | 0 .../basic-interface-monitoring/http.go | 0 .../basic-interface-monitoring/main.go | 0 .../network-element.go | 0 .../webpage/index.html | 0 applications/hostname-checker/app.go | 0 applications/hostname-checker/device.go | 0 applications/hostname-checker/main.go | 0 applications/inventory-manager/README.md | 0 .../inventory-manager/config/config.go | 0 applications/inventory-manager/example.yml | 0 .../inventory-manager.Dockerfile | 0 .../inventory-manager.Dockerfile.dockerignore | 0 .../inventoryManager/inventoryManager.go | 0 .../inventoryManager/util.go | 0 applications/inventory-manager/main.go | 0 applications/venv-manager/Readme.md | 0 .../venv-manager/containerlab/containerlab.go | 0 applications/venv-manager/links/link.go | 0 applications/venv-manager/main.go | 0 applications/venv-manager/node/node.go | 0 applications/venv-manager/port/port.go | 0 .../venv-manager/topology/topology.go | 0 .../venv-manager/venv-manager.Dockerfile | 0 .../venv-manager.Dockerfile.dockerignore | 0 .../venv-manager/venv-manager/venv-manager.go | 0 .../venv-manager/yang-parser/yang-parser.go | 0 applications/ws-events/app.go | 0 applications/ws-events/main.go | 0 applications/ws-events/ws-events.Dockerfile | 0 .../ws-events.Dockerfile.dockerignore | 0 applications/ws-events/ws.go | 0 cli/LICENSE | 0 cli/README.md | 0 cli/adapter/PndAdapter.go | 0 cli/adapter/PndAdapter_test.go | 0 cli/build/ci/.security-and-compliance-ci.yml | 0 cli/build/ci/.test.yml | 0 cli/cli.Dockerfile | 0 cli/cli.Dockerfile.dockerignore | 0 cli/cmd/change.go | 0 cli/cmd/changeCommit.go | 0 cli/cmd/changeConfirm.go | 0 cli/cmd/changeGet.go | 0 cli/cmd/changeList.go | 0 cli/cmd/config/.gosdnc.toml | 0 cli/cmd/list.go | 0 cli/cmd/login.go | 0 cli/cmd/logout.go | 0 cli/cmd/networkElement.go | 0 cli/cmd/networkElementCreate.go | 0 cli/cmd/networkElementList.go | 0 cli/cmd/networkElementPath.go | 0 cli/cmd/networkElementPathDelete.go | 0 cli/cmd/networkElementPathGet.go | 0 cli/cmd/networkElementPathGetIntended.go | 0 cli/cmd/networkElementPathSet.go | 0 cli/cmd/networkElementRemove.go | 0 cli/cmd/networkElementShow.go | 0 cli/cmd/networkElementSubscribe.go | 0 cli/cmd/plugin.go | 0 cli/cmd/pluginList.go | 0 cli/cmd/pnd.go | 0 cli/cmd/pndCreate.go | 0 cli/cmd/pndGet.go | 0 cli/cmd/pndList.go | 0 cli/cmd/pndRemove.go | 0 cli/cmd/pndUse.go | 0 cli/cmd/prompt.go | 0 cli/cmd/role.go | 0 cli/cmd/roleCreate.go | 0 cli/cmd/roleGetAll.go | 0 cli/cmd/root.go | 0 cli/cmd/subManagement.go | 0 cli/cmd/subManagementGetAll.go | 0 cli/cmd/subManagementResetAll.go | 0 cli/cmd/user.go | 0 cli/cmd/userCreate.go | 0 cli/cmd/userDelete.go | 0 cli/cmd/userGet.go | 0 cli/cmd/userGetAll.go | 0 cli/cmd/userUpdate.go | 0 cli/cmd/utils.go | 0 cli/cmd/utils_test.go | 0 cli/completer/utils.go | 0 cli/completer/yangSchemaCompleter.go | 0 cli/config/.cobra.yaml | 0 cli/config/gosdnc.toml.example | 0 cli/main.go | 0 .../integrationtest.clab.tmpl.yml | 0 .../integrationtest_branch.clab.tmpl.yml | 0 config.js | 0 controller/ARCHITECTURE.md | 0 controller/CONTRIBUTING.md | 0 controller/Dockerfile.debug | 0 controller/Makefile | 0 controller/README.md | 0 controller/api/apiUtil_test.go | 0 controller/api/api_test.go | 0 controller/api/api_test.toml | 0 controller/api/app.go | 0 controller/api/auth.go | 0 controller/api/auth_test.go | 0 controller/api/change.go | 0 controller/api/configurationManagement.go | 0 controller/api/grpc.go | 0 controller/api/initialise_test.go | 0 controller/api/managedNetworkElement.go | 0 controller/api/plugin.go | 0 controller/api/pnd.go | 0 controller/api/role.go | 0 controller/api/role_test.go | 0 controller/api/subManagement.go | 0 controller/api/user.go | 0 controller/api/user_test.go | 0 controller/app/DatabaseStore.go | 0 controller/app/Service.go | 0 controller/app/app.go | 0 controller/app/store.go | 0 controller/app/utils.go | 0 controller/cmd/gosdn/main.go | 0 controller/cmd/root.go | 0 controller/cmd/version.go | 0 controller/config/config.go | 0 controller/config/config_test.go | 0 controller/config/environment.go | 0 controller/config/gnmiSubscriptionConfig.go | 0 controller/configs/.gitkeep | 0 controller/configs/basic-docker-compose.toml | 0 .../configs/containerlab-gosdn.toml.example | 0 .../configs/development-gosdn.toml.example | 0 .../configs/gNMISubscriptions.txt.example | 0 .../configs/integration-test-gosdn.toml | 0 controller/conflict/versioning.go | 0 controller/controller.Dockerfile | 0 controller/controller.Dockerfile.dockerignore | 0 controller/controller.go | 0 controller/controller_test.go | 0 controller/customerrs/errors.go | 0 controller/event/event.go | 0 controller/event/event_test.go | 0 controller/eventService/Service.go | 0 controller/eventService/utils.go | 0 controller/http.go | 0 controller/http_test.go | 0 controller/initialise_test.go | 0 controller/interfaces/change/change.go | 0 controller/interfaces/event/service.go | 0 controller/interfaces/networkdomain/pnd.go | 0 .../interfaces/networkdomain/pndService.go | 0 .../interfaces/networkdomain/pndStore.go | 0 .../networkelement/networkElement.go | 0 .../networkelement/networkElementService.go | 0 .../networkelement/networkElementStore.go | 0 controller/interfaces/plugin/plugin.go | 0 controller/interfaces/plugin/pluginService.go | 0 controller/interfaces/plugin/pluginStore.go | 0 controller/interfaces/rbac/rbacService.go | 0 controller/interfaces/rbac/role.go | 0 controller/interfaces/rbac/roleStore.go | 0 controller/interfaces/rbac/user.go | 0 controller/interfaces/rbac/userStore.go | 0 controller/interfaces/store/store.go | 0 controller/interfaces/transport/transport.go | 0 controller/metrics/prometheus.go | 0 controller/mocks/Change.go | 0 controller/mocks/Csbi.go | 0 controller/mocks/Device.go | 0 controller/mocks/GNMIClient.go | 0 controller/mocks/GNMIServer.go | 0 controller/mocks/GNMI_SubscribeClient.go | 0 controller/mocks/GNMI_SubscribeServer.go | 0 controller/mocks/GenericGoStructClient.go | 0 controller/mocks/HandleSubscribeResponse.go | 0 controller/mocks/NetworkDomain.go | 0 controller/mocks/NetworkElement.go | 0 controller/mocks/Plugin.go | 0 .../mocks/PluginRegistryServiceClient.go | 0 controller/mocks/Plugin_additions.go | 0 controller/mocks/PndService.go | 0 controller/mocks/PndStore.go | 0 controller/mocks/Pnd_Additions.go | 0 controller/mocks/Role.go | 0 controller/mocks/RoleService.go | 0 controller/mocks/RoleStore.go | 0 controller/mocks/Service.go | 0 controller/mocks/Storable.go | 0 controller/mocks/Store.go | 0 controller/mocks/Transport.go | 0 controller/mocks/UnsafeGNMIServer.go | 0 controller/mocks/User.go | 0 controller/mocks/UserService.go | 0 controller/mocks/UserStore.go | 0 .../mocks/isSubscribeRequest_Request.go | 0 .../mocks/isSubscribeResponse_Response.go | 0 controller/mocks/isTypedValue_Value.go | 0 controller/northbound/client/app.go | 0 .../client/configurationManagement.go | 0 .../northbound/client/networkElement.go | 0 controller/northbound/client/plugin.go | 0 controller/northbound/client/pnd.go | 0 controller/northbound/client/rbac.go | 0 controller/northbound/client/sbi.go | 0 controller/northbound/client/submanagement.go | 0 controller/northbound/server/app.go | 0 controller/northbound/server/auth.go | 0 .../northbound/server/auth_interceptor.go | 0 .../server/auth_interceptor_test.go | 0 controller/northbound/server/auth_test.go | 0 .../server/configurationmanagement.go | 0 controller/northbound/server/csbi.go | 0 controller/northbound/server/metrics.go | 0 controller/northbound/server/nbi.go | 0 .../northbound/server/networkElement.go | 0 .../northbound/server/networkElement_test.go | 0 controller/northbound/server/plugin.go | 0 controller/northbound/server/pnd.go | 0 controller/northbound/server/pnd_test.go | 0 controller/northbound/server/role.go | 0 controller/northbound/server/role_test.go | 0 controller/northbound/server/route.go | 0 controller/northbound/server/submanagement.go | 0 .../northbound/server/test_util_test.go | 0 controller/northbound/server/topology.go | 0 controller/northbound/server/topology_test.go | 0 controller/northbound/server/user.go | 0 controller/northbound/server/user_test.go | 0 controller/northbound/server/utils_test.go | 0 controller/nucleus/change.go | 0 controller/nucleus/change_test.go | 0 controller/nucleus/clientConfig.go | 0 .../nucleus/database/mongo-connection.go | 0 .../nucleus/databaseNetworkElementStore.go | 0 controller/nucleus/databasePluginStore.go | 0 controller/nucleus/databasePndStore.go | 0 controller/nucleus/genericService.go | 0 controller/nucleus/gnmi_transport.go | 0 controller/nucleus/gnmi_transport_test.go | 0 controller/nucleus/initialise_test.go | 0 .../nucleus/memoryNetworkElementStore.go | 0 controller/nucleus/memoryPluginStore.go | 0 controller/nucleus/memoryPndStore.go | 0 controller/nucleus/networkElement.go | 0 .../nucleus/networkElementFilesystemStore.go | 0 .../networkElementFilesystemStore_test.go | 0 controller/nucleus/networkElementService.go | 0 .../nucleus/networkElementServiceMock.go | 0 .../nucleus/networkElementService_test.go | 0 controller/nucleus/networkElementStore.go | 0 controller/nucleus/networkElementWatcher.go | 0 controller/nucleus/networkElement_test.go | 0 controller/nucleus/plugin.go | 0 controller/nucleus/pluginFilesystemStore.go | 0 .../nucleus/pluginFilesystemStore_test.go | 0 controller/nucleus/pluginService.go | 0 controller/nucleus/pluginServiceMock.go | 0 controller/nucleus/pluginStore.go | 0 controller/nucleus/plugin_test.go | 0 controller/nucleus/pndFilesystemStore.go | 0 controller/nucleus/pndFilesystemStore_test.go | 0 controller/nucleus/pndService.go | 0 controller/nucleus/pndStore.go | 0 controller/nucleus/principalNetworkDomain.go | 0 .../nucleus/principalNetworkDomain_test.go | 0 controller/nucleus/restconf_transport.go | 0 controller/nucleus/restconf_transport_test.go | 0 .../nucleus/subscriptionQueueHandler.go | 0 controller/nucleus/transport.go | 0 controller/nucleus/transport_test.go | 0 controller/nucleus/types/types.go | 0 controller/nucleus/util/gnmi/convert.go | 0 controller/nucleus/util/gnmi/notification.go | 0 controller/nucleus/util/path/translate.go | 0 controller/nucleus/util/path/traverse.go | 0 controller/nucleus/util/path/traverse_test.go | 0 controller/nucleus/util/plugin.go | 0 controller/nucleus/util/proto/message.go | 0 controller/nucleus/util/proto/message_test.go | 0 controller/plugin/shared/client.go | 0 controller/plugin/shared/interface.go | 0 controller/plugin/shared/server.go | 0 controller/plugin/shared/util.go | 0 controller/rbac/databaseRoleStore.go | 0 controller/rbac/databaseUserStore.go | 0 controller/rbac/jwtManager.go | 0 controller/rbac/jwtManager_test.go | 0 controller/rbac/memoryRoleStore.go | 0 controller/rbac/memoryUserStore.go | 0 controller/rbac/rbacService.go | 0 controller/rbac/rbacTestUtil_test.go | 0 controller/rbac/role.go | 0 controller/rbac/roleFileSystemStore.go | 0 controller/rbac/roleFileSystemStore_test.go | 0 controller/rbac/roleStore.go | 0 controller/rbac/user.go | 0 controller/rbac/userFileSystemStore.go | 0 controller/rbac/userFileSystemStore_test.go | 0 controller/rbac/userStore.go | 0 controller/store/changeStores.go | 0 controller/store/filesystem-settings.go | 0 controller/store/genericStore.go | 0 controller/store/initialise_test.go | 0 controller/store/oldGenericStore.go | 0 controller/store/query.go | 0 controller/store/storageMode.go | 0 controller/store/utils.go | 0 .../test/arista-interface-response.json | 0 .../test/arista-interface-response2.json | 0 controller/test/arista-root-response.json | 0 .../containerlab/complex-1.0.clab.tmpl.yml | 0 controller/test/containerlab/complex-1.0.png | Bin .../test/containerlab/dev.clab.tmpl.yml | 0 .../test/containerlab/int01.clab.tmpl.yml | 0 controller/test/plugin/csbiAdditions.go | 0 .../test/plugin/faulty/csbiAdditions.go | 0 controller/test/plugin/faulty/gostructs.go | 0 controller/test/plugin/faulty/plugin.yml | 0 controller/test/plugin/gostructs.go | 0 controller/test/plugin/plugin.yml | 0 controller/test/proto/cap-resp-arista-ceos | 0 controller/test/proto/req-full-node | 0 .../test/proto/req-full-node-arista-ceos | Bin .../test/proto/req-interfaces-arista-ceos | 0 .../req-interfaces-interface-arista-ceos | 0 controller/test/proto/req-interfaces-wildcard | 0 controller/test/proto/resp-full-node | 0 .../test/proto/resp-full-node-arista-ceos | Bin .../test/proto/resp-interfaces-arista-ceos | 0 .../resp-interfaces-interface-arista-ceos | 0 .../test/proto/resp-interfaces-wildcard | 0 .../proto/resp-set-system-config-hostname | 0 controller/test/targets.go | 0 controller/test/terraform/.docker/ca.pem | 0 controller/test/terraform/.docker/cert.pem | 0 .../test/terraform/.docker/server-cert.pem | 0 controller/test/terraform/containers.tf | 0 controller/test/terraform/images.tf | 0 controller/test/terraform/main.tf | 0 controller/test/terraform/providers.tf | 0 controller/test/terraform/resources.tf | 0 controller/test/terraform/variables.tf | 0 controller/test/yang/test-module.go | 0 controller/test/yang/test.yang | 0 controller/test/yang/yang.go | 0 controller/topology/links/link.go | 0 .../topology/nodes/databaseNodeStore.go | 0 controller/topology/nodes/node.go | 0 controller/topology/nodes/nodeService.go | 0 controller/topology/nodes/nodeService_test.go | 0 controller/topology/nodes/store.go | 0 .../ports/configuration/configuration.go | 0 controller/topology/ports/port.go | 0 controller/topology/ports/portService.go | 0 controller/topology/ports/portService_test.go | 0 controller/topology/ports/portStore.go | 0 controller/topology/ports/store.go | 0 controller/topology/routing-tables/route.go | 0 .../topology/routing-tables/routingTable.go | 0 .../routing-tables/routingTableService.go | 0 .../routingTableService_test.go | 0 .../routing-tables/routingTableStore.go | 0 controller/topology/routing-tables/store.go | 0 controller/topology/store.go | 0 controller/topology/store/genericStore.go | 0 .../topology/store/genericStore_test.go | 0 controller/topology/store/query.go | 0 controller/topology/topology.go | 0 controller/topology/topologyService.go | 0 controller/topology/topologyService_test.go | 0 controller/topology/topologyStore.go | 0 controller/version/version.go | 0 controller/version/version_test.go | 0 csbi/.csbi.yaml | 0 csbi/Dockerfile.exec | 0 csbi/LICENSE | 0 csbi/README.md | 0 csbi/arista.capabilities | 0 csbi/build.go | 0 csbi/build/ci/.build-container.yml | 0 csbi/build/ci/.code-quality-ci.yml | 0 csbi/build/ci/.golangci-config/.golangci.yml | 0 csbi/build/ci/.security-and-compliance-ci.yml | 0 csbi/build/ci/.test.yml | 0 csbi/build_test.go | 0 csbi/cmd/csbi/main.go | 0 csbi/cmd/debug/main.go | 0 csbi/cmd/demo/main.go | 0 csbi/cmd/deploy.go | 0 csbi/cmd/discover.go | 0 csbi/cmd/executor/executor.go | 0 csbi/cmd/executor/experiment.yaml | 0 csbi/cmd/generate.go | 0 csbi/cmd/hello.go | 0 csbi/cmd/init.go | 0 csbi/cmd/repository.go | 0 csbi/cmd/root.go | 0 csbi/config/config.go | 0 csbi/csbi.Dockerfile | 0 csbi/csbi.Dockerfile.dockerignore | 0 csbi/deployment.go | 0 csbi/deployment_test.go | 0 csbi/discover.go | 0 csbi/discover_test.go | 0 csbi/docker-compose.yml | 0 csbi/generate.go | 0 csbi/generate_test.go | 0 csbi/gnmi-target/gnmitarget.Dockerfile | 0 .../gnmitarget.Dockerfile.dockerignore | 0 .../datasources/prometheus_ds.yml | 0 csbi/grpc.go | 0 csbi/grpc_test.go | 0 csbi/http.go | 0 csbi/http_test.go | 0 csbi/metrics.go | 0 csbi/model.go | 0 csbi/orchestrator.go | 0 csbi/orchestrator_test.go | 0 csbi/prometheus/alerts.yml | 0 csbi/prometheus/prometheus.yml | 0 csbi/report.xml | 0 csbi/repository.go | 0 csbi/repository_test.go | 0 csbi/resources/Dockerfile | 0 csbi/resources/config.yaml | 0 csbi/resources/csbi.go | 0 csbi/resources/csbiAdditions.go | 0 csbi/resources/go.mod | 0 csbi/resources/go.sum | 0 csbi/resources/gostructs.go | 0 csbi/run.go | 0 csbi/run_test.go | 0 csbi/templates.go | 0 csbi/test.clab.yml | 0 .../gostructs.go | 0 .../experimental/eos/models/arista-cli.yang | 0 .../eos/models/arista-eos-types.yang | 0 .../eos/models/arista-exp-eos.yang | 0 .../eos/models/cert/arista-gnoi-cert.yang | 0 .../eos/models/evpn/arista-exp-eos-evpn.yang | 0 .../arista-exp-eos-igmpsnooping.yang | 0 .../arista-exp-eos-l2protocolforwarding.yang | 0 .../eos/models/mlag/arista-exp-eos-mlag.yang | 0 .../multicast/arista-exp-eos-multicast.yang | 0 .../models/openconfig-component-counters.yang | 0 .../qos/arista-exp-eos-qos-acl-config.yang | 0 .../models/qos/arista-exp-eos-qos-config.yang | 0 .../eos/models/qos/arista-exp-eos-qos.yang | 0 .../eos/models/rpc/arista-rpc-netconf.yang | 0 .../models/varp/arista-exp-eos-varp-intf.yang | 0 .../varp/arista-exp-eos-varp-net-inst.yang | 0 .../eos/models/vlan/vlan-translation.yang | 0 .../vxlan/arista-exp-eos-vxlan-config.yang | 0 .../models/vxlan/arista-exp-eos-vxlan.yang | 0 .../models/openconfig/hercules/LICENSE | 0 .../yang/openconfig-hercules-interfaces.yang | 0 .../openconfig-hercules-platform-chassis.yang | 0 ...openconfig-hercules-platform-linecard.yang | 0 .../openconfig-hercules-platform-node.yang | 0 .../openconfig-hercules-platform-port.yang | 0 .../yang/openconfig-hercules-platform.yang | 0 .../yang/openconfig-hercules-qos.yang | 0 .../hercules/yang/openconfig-hercules.yang | 0 .../testdata/models/openconfig/public/LICENSE | 0 .../openconfig/public/release/README.md | 0 .../public/release/models/acl/.spec.yml | 0 .../release/models/acl/openconfig-acl.yang | 0 .../acl/openconfig-packet-match-types.yang | 0 .../models/acl/openconfig-packet-match.yang | 0 .../public/release/models/aft/.spec.yml | 0 .../models/aft/openconfig-aft-common.yang | 0 .../models/aft/openconfig-aft-ethernet.yang | 0 .../models/aft/openconfig-aft-ipv4.yang | 0 .../models/aft/openconfig-aft-ipv6.yang | 0 .../models/aft/openconfig-aft-mpls.yang | 0 .../aft/openconfig-aft-network-instance.yang | 0 .../release/models/aft/openconfig-aft-pf.yang | 0 .../models/aft/openconfig-aft-types.yang | 0 .../release/models/aft/openconfig-aft.yang | 0 .../public/release/models/bfd/.spec.yml | 0 .../release/models/bfd/openconfig-bfd.yang | 0 .../public/release/models/bgp/.spec.yml | 0 .../openconfig-bgp-common-multiprotocol.yang | 0 .../bgp/openconfig-bgp-common-structure.yang | 0 .../models/bgp/openconfig-bgp-common.yang | 0 .../models/bgp/openconfig-bgp-errors.yang | 0 .../models/bgp/openconfig-bgp-global.yang | 0 .../models/bgp/openconfig-bgp-neighbor.yang | 0 .../models/bgp/openconfig-bgp-peer-group.yang | 0 .../models/bgp/openconfig-bgp-policy.yang | 0 .../models/bgp/openconfig-bgp-types.yang | 0 .../release/models/bgp/openconfig-bgp.yang | 0 .../public/release/models/catalog/.spec.yml | 0 .../catalog/openconfig-catalog-types.yang | 0 .../catalog/openconfig-module-catalog.yang | 0 .../public/release/models/firewall/.spec.yml | 0 .../openconfig-fw-high-availability.yang | 0 .../openconfig-fw-link-monitoring.yang | 0 .../release/models/interfaces/.spec.yml | 0 .../interfaces/openconfig-if-8021x.yang | 0 .../interfaces/openconfig-if-aggregate.yang | 0 .../openconfig-if-ethernet-ext.yang | 0 .../interfaces/openconfig-if-ethernet.yang | 0 .../interfaces/openconfig-if-ip-ext.yang | 0 .../models/interfaces/openconfig-if-ip.yang | 0 .../models/interfaces/openconfig-if-poe.yang | 0 .../interfaces/openconfig-if-sdn-ext.yang | 0 .../interfaces/openconfig-if-tunnel.yang | 0 .../interfaces/openconfig-if-types.yang | 0 .../interfaces/openconfig-interfaces.yang | 0 .../public/release/models/isis/.spec.yml | 0 .../isis/openconfig-isis-lsdb-types.yang | 0 .../models/isis/openconfig-isis-lsp.yang | 0 .../models/isis/openconfig-isis-policy.yang | 0 .../models/isis/openconfig-isis-routing.yang | 0 .../models/isis/openconfig-isis-types.yang | 0 .../release/models/isis/openconfig-isis.yang | 0 .../public/release/models/lacp/.spec.yml | 0 .../release/models/lacp/openconfig-lacp.yang | 0 .../public/release/models/lldp/.spec.yml | 0 .../models/lldp/openconfig-lldp-types.yang | 0 .../release/models/lldp/openconfig-lldp.yang | 0 .../release/models/local-routing/.spec.yml | 0 .../openconfig-local-routing.yang | 0 .../public/release/models/macsec/.spec.yml | 0 .../macsec/openconfig-macsec-types.yang | 0 .../models/macsec/openconfig-macsec.yang | 0 .../public/release/models/mpls/.spec.yml | 0 .../models/mpls/openconfig-mpls-igp.yang | 0 .../models/mpls/openconfig-mpls-ldp.yang | 0 .../models/mpls/openconfig-mpls-rsvp.yang | 0 .../models/mpls/openconfig-mpls-sr.yang | 0 .../models/mpls/openconfig-mpls-static.yang | 0 .../models/mpls/openconfig-mpls-te.yang | 0 .../models/mpls/openconfig-mpls-types.yang | 0 .../release/models/mpls/openconfig-mpls.yang | 0 .../public/release/models/multicast/.spec.yml | 0 .../multicast/openconfig-igmp-types.yang | 0 .../models/multicast/openconfig-igmp.yang | 0 .../multicast/openconfig-pim-types.yang | 0 .../models/multicast/openconfig-pim.yang | 0 .../release/models/network-instance/.spec.yml | 0 .../openconfig-network-instance-l2.yang | 0 .../openconfig-network-instance-l3.yang | 0 .../openconfig-network-instance-policy.yang | 0 .../openconfig-network-instance-types.yang | 0 .../openconfig-network-instance.yang | 0 .../release/models/openconfig-extensions.yang | 0 .../public/release/models/openflow/.spec.yml | 0 .../openflow/openconfig-openflow-types.yang | 0 .../models/openflow/openconfig-openflow.yang | 0 .../models/optical-transport/.spec.yml | 0 .../openconfig-channel-monitor.yang | 0 .../openconfig-optical-amplifier.yang | 0 .../openconfig-optical-attenuator.yang | 0 .../openconfig-terminal-device.yang | 0 .../openconfig-transport-line-common.yang | 0 ...penconfig-transport-line-connectivity.yang | 0 .../openconfig-transport-line-protection.yang | 0 .../openconfig-transport-types.yang | 0 .../openconfig-wavelength-router.yang | 0 .../public/release/models/ospf/.spec.yml | 0 .../models/ospf/openconfig-ospf-policy.yang | 0 .../models/ospf/openconfig-ospf-types.yang | 0 .../openconfig-ospfv2-area-interface.yang | 0 .../models/ospf/openconfig-ospfv2-area.yang | 0 .../models/ospf/openconfig-ospfv2-common.yang | 0 .../models/ospf/openconfig-ospfv2-global.yang | 0 .../models/ospf/openconfig-ospfv2-lsdb.yang | 0 .../models/ospf/openconfig-ospfv2.yang | 0 .../public/release/models/p4rt/.spec.yml | 0 .../release/models/p4rt/openconfig-p4rt.yang | 0 .../public/release/models/platform/.spec.yml | 0 .../platform/openconfig-platform-cpu.yang | 0 .../platform/openconfig-platform-ext.yang | 0 .../platform/openconfig-platform-fan.yang | 0 .../openconfig-platform-linecard.yang | 0 ...openconfig-platform-pipeline-counters.yang | 0 .../platform/openconfig-platform-port.yang | 0 .../platform/openconfig-platform-psu.yang | 0 .../openconfig-platform-software.yang | 0 .../openconfig-platform-transceiver.yang | 0 .../platform/openconfig-platform-types.yang | 0 .../models/platform/openconfig-platform.yang | 0 .../models/policy-forwarding/.spec.yml | 0 .../openconfig-pf-forwarding-policies.yang | 0 .../openconfig-pf-interfaces.yang | 0 .../openconfig-pf-path-groups.yang | 0 .../policy-forwarding/openconfig-pf-srte.yang | 0 .../openconfig-policy-forwarding.yang | 0 .../public/release/models/policy/.spec.yml | 0 .../policy/openconfig-policy-types.yang | 0 .../policy/openconfig-routing-policy.yang | 0 .../public/release/models/probes/.spec.yml | 0 .../probes/openconfig-probes-types.yang | 0 .../models/probes/openconfig-probes.yang | 0 .../public/release/models/qos/.spec.yml | 0 .../models/qos/openconfig-qos-elements.yang | 0 .../models/qos/openconfig-qos-interfaces.yang | 0 .../models/qos/openconfig-qos-types.yang | 0 .../release/models/qos/openconfig-qos.yang | 0 .../release/models/relay-agent/.spec.yml | 0 .../relay-agent/openconfig-relay-agent.yang | 0 .../public/release/models/rib/.spec.yml | 0 .../rib/openconfig-rib-bgp-attributes.yang | 0 .../models/rib/openconfig-rib-bgp-ext.yang | 0 .../openconfig-rib-bgp-shared-attributes.yang | 0 .../openconfig-rib-bgp-table-attributes.yang | 0 .../models/rib/openconfig-rib-bgp-tables.yang | 0 .../models/rib/openconfig-rib-bgp-types.yang | 0 .../models/rib/openconfig-rib-bgp.yang | 0 .../public/release/models/sampling/.spec.yml | 0 .../sampling/openconfig-sampling-sflow.yang | 0 .../release/models/segment-routing/.spec.yml | 0 .../openconfig-rsvp-sr-ext.yang | 0 .../openconfig-segment-routing-types.yang | 0 .../openconfig-segment-routing.yang | 0 .../openconfig-srte-policy.yang | 0 .../public/release/models/stp/.spec.yml | 0 .../stp/openconfig-spanning-tree-types.yang | 0 .../models/stp/openconfig-spanning-tree.yang | 0 .../public/release/models/system/.spec.yml | 0 .../models/system/openconfig-aaa-radius.yang | 0 .../models/system/openconfig-aaa-tacacs.yang | 0 .../models/system/openconfig-aaa-types.yang | 0 .../release/models/system/openconfig-aaa.yang | 0 .../models/system/openconfig-alarm-types.yang | 0 .../models/system/openconfig-alarms.yang | 0 .../models/system/openconfig-license.yang | 0 .../models/system/openconfig-messages.yang | 0 .../models/system/openconfig-procmon.yang | 0 .../system/openconfig-system-logging.yang | 0 .../system/openconfig-system-management.yang | 0 .../system/openconfig-system-terminal.yang | 0 .../models/system/openconfig-system.yang | 0 .../public/release/models/telemetry/.spec.yml | 0 .../telemetry/openconfig-telemetry-types.yang | 0 .../telemetry/openconfig-telemetry.yang | 0 .../public/release/models/types/.spec.yml | 0 .../models/types/openconfig-inet-types.yang | 0 .../models/types/openconfig-types.yang | 0 .../models/types/openconfig-yang-types.yang | 0 .../public/release/models/vlan/.spec.yml | 0 .../models/vlan/openconfig-vlan-types.yang | 0 .../release/models/vlan/openconfig-vlan.yang | 0 .../public/release/models/wifi/.spec.yml | 0 .../public/release/models/wifi/README.md | 0 .../models/wifi/openconfig-access-points.yang | 0 .../models/wifi/openconfig-ap-interfaces.yang | 0 .../models/wifi/openconfig-ap-manager.yang | 0 .../models/wifi/openconfig-wifi-mac.yang | 0 .../models/wifi/openconfig-wifi-phy.yang | 0 .../models/wifi/openconfig-wifi-types.yang | 0 .../models/acl/arista-acl-deviations.yang | 0 .../models/aft/arista-aft-augments.yang | 0 .../models/bfd/arista-bfd-augments.yang | 0 .../models/bfd/arista-bfd-deviations.yang | 0 .../models/bgp/arista-bgp-augments.yang | 0 .../models/bgp/arista-bgp-deviations.yang | 0 .../interfaces/arista-intf-augments.yang | 0 .../interfaces/arista-intf-deviations.yang | 0 .../models/isis/arista-isis-augments.yang | 0 .../models/isis/arista-isis-deviations.yang | 0 .../models/lacp/arista-lacp-augments.yang | 0 .../models/lacp/arista-lacp-deviations.yang | 0 .../models/lldp/arista-lldp-augments.yang | 0 .../models/lldp/arista-lldp-deviations.yang | 0 .../arista-local-routing-deviations.yang | 0 .../models/mpls/arista-mpls-augments.yang | 0 .../models/mpls/arista-mpls-deviations.yang | 0 .../models/multicast/arista-pim-augments.yang | 0 .../arista-netinst-deviations.yang | 0 .../arista-vlan-augments.yang | 0 .../arista-vlan-deviations.yang | 0 .../arista-acl-notsupported-deviations.yang | 0 .../arista-bfd-notsupported-deviations.yang | 0 .../arista-bgp-notsupported-deviations.yang | 0 ...ta-interfaces-notsupported-deviations.yang | 0 .../arista-lacp-notsupported-deviations.yang | 0 .../arista-lldp-notsupported-deviations.yang | 0 ...local-routing-notsupported-deviations.yang | 0 ...ista-messages-notsupported-deviations.yang | 0 ...work-instance-notsupported-deviations.yang | 0 ...ista-platform-notsupported-deviations.yang | 0 .../arista-qos-notsupported-deviations.yang | 0 ...outing-policy-notsupported-deviations.yang | 0 ...arista-system-notsupported-deviations.yang | 0 .../openflow/arista-openflow-deviations.yang | 0 .../arista-srte-augments.yang | 0 .../arista-srte-deviations.yang | 0 .../models/policy/arista-rpol-augments.yang | 0 .../models/policy/arista-rpol-deviations.yang | 0 .../models/qos/arista-qos-augments.yang | 0 .../arista-relay-agent-deviations.yang | 0 .../models/system/arista-system-augments.yang | 0 .../system/arista-system-deviations.yang | 0 csbi/testdata/models/third_party/README.md | 0 .../models/third_party/ietf/iana-if-type.yang | 0 .../third_party/ietf/ietf-inet-types.yang | 0 .../third_party/ietf/ietf-interfaces.yang | 0 .../third_party/ietf/ietf-yang-types.yang | 0 csbi/write.go | 0 csbi/write_test.go | 0 dev_env_data/clab/basic_one_arista.yaml | 0 dev_env_data/clab/basic_two_aristas.yaml | 0 dev_env_data/clab/basic_two_gnmi_targets.yaml | 0 dev_env_data/clab/demo.clab.yaml | 0 dev_env_data/clab/gosdn.clab.yaml | 0 dev_env_data/clab/gosdn_slim.clab.yaml | 0 .../docker-compose/basic_docker-compose.yml | 0 .../integration-test_docker-compose.yml | 0 .../plugin-registry/plugin-store.json | 0 dev_env_data/sdn/basic_two_aristas.json | 0 docker-compose.yml | 0 docker_volume_backup/.gitkeep | 0 docs/images/logo.png | Bin docs/images/logo.svg | 0 docs/index.md | 0 documentation/README.md | 0 documentation/SUMMARY.md | 0 documentation/figures/.gitkeep | 0 documentation/figures/nucleus/.gitkeep | 0 ...ted_controller_architecture_nucleus.drawio | 0 ...controller_architecture_nucleus.drawio.png | Bin documentation/figures/overview/.gitkeep | 0 ...ed_controller_architecture_overview.drawio | 0 ...ontroller_architecture_overview.drawio.png | Bin documentation/figures/plugins/.gitkeep | 0 .../plugins/plugin-device-interaction.drawio | 0 .../plugin-device-interaction.drawio.png | Bin forks/LICENSE | 0 forks/README.md | 0 forks/goarista/gnmi/arbitration.go | 0 forks/goarista/gnmi/arbitration_test.go | 0 forks/goarista/gnmi/client.go | 0 forks/goarista/gnmi/json.go | 0 forks/goarista/gnmi/operation.go | 0 forks/goarista/gnmi/operation_test.go | 0 forks/goarista/gnmi/path.go | 0 forks/goarista/gnmi/path_test.go | 0 forks/google/README.md | 0 forks/google/gnmi/model.go | 0 forks/google/gnmi/modeldata/gostruct/gen.go | 0 .../gnmi/modeldata/gostruct/generated.go.wasd | 0 forks/google/gnmi/modeldata/modeldata.go | 0 forks/google/gnmi/server.go | 0 forks/google/gnmi/server_test.go.wasd | 0 forks/google/gnmi/util.go | 0 go.mod | 0 go.sum | 0 gosdn-cli-showcase.webm | Bin .../application_tests/appUtility_test.go | 0 .../application_tests/application_test.go | 0 .../application_tests/eventAssertion_test.go | 0 .../example_tests/example_test.go | 0 .../integrationTestUtils.go | 0 integration-tests/lab_tests/lab00_test.go | 0 .../lab_tests/labUtility_test.go | 0 .../networkElement_tests/modelUtility_test.go | 0 .../networkElement_test.go | 0 integration-tests/rbac_tests/rbac_test.go | 0 .../topology_tests/topology_test.go | 0 lab-vm/README.md | 0 lab-vm/vm-with-packer/gosdn_vm.pkr.hcl | 0 lab-vm/vm-with-packer/http/meta-data | 0 lab-vm/vm-with-packer/http/user-data | 0 lab-vm/vm-with-packer/scripts/gosdn_clone.sh | 0 lab-vm/vm-with-packer/scripts/setup.sh | 0 lab-vm/vm-with-vagrant/Vagrantfile | 0 makefiles/build/Makefile | 0 makefiles/ci/Makefile | 0 makefiles/clab/Makefile | 0 makefiles/container/Makefile | 0 makefiles/generate/Makefile | 0 mkdocs.yml | 0 models/generated/README.md | 0 models/generated/arista/additions.patch | 0 models/generated/arista/arista.go | 0 models/generated/arista/config.yaml | 0 models/generated/arista/yang.go | 0 models/generated/openconfig/additions.patch | 0 models/generated/openconfig/config.yaml | 0 models/generated/openconfig/openconfig.go | 0 models/generated/openconfig/yang.go | 0 plugin-registry/README.md | 0 plugin-registry/main.go | 0 plugin-registry/plugin-registry.Dockerfile | 0 .../plugin-registry.Dockerfile.dockerignore | 0 .../plugin-registry.debug.Dockerfile | 0 ...gin-registry.debug.Dockerfile.dockerignore | 0 plugin-registry/registry.go | 0 plugin-registry/server.go | 0 plugin-registry/store.go | 0 plugins/README.md | 0 plugins/examples/arista/cmd/main.go | 0 plugins/examples/arista/plugin.yaml | 0 plugins/examples/openconfig/cmd/main.go | 0 plugins/examples/openconfig/plugin.yaml | 0 plugins/sdk/deviceModel.go | 0 .../components/devices/view/device.view.tsx | 110 ++++++++-------- .../view_model/information.box.viewmodel.ts | 19 +-- react-ui/src/index.tsx | 1 + react-ui/src/shared/api/api.ts | 119 ++++++++---------- .../json_viewer/view/json_viewer.scss | 8 +- .../viewmodel/json_viewer.viewmodel.tsx | 21 ++-- react-ui/src/shared/icons/icons.ts | 4 + .../layouts/grid.layout/grid.layout.tsx | 70 +++++------ react-ui/src/shared/style/box.scss | 59 +++++++++ renovate.json | 0 1060 files changed, 231 insertions(+), 183 deletions(-) mode change 100755 => 100644 .cobra.yaml mode change 100755 => 100644 .devcontainer/Dockerfile mode change 100755 => 100644 .devcontainer/devcontainer.json mode change 100755 => 100644 .dockerignore mode change 100755 => 100644 .editorconfig mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .gitlab-ci.yml mode change 100755 => 100644 .gitlab/ci/.build-binaries.yml mode change 100755 => 100644 .gitlab/ci/.build-container-images.yml mode change 100755 => 100644 .gitlab/ci/.code-quality-ci.yml mode change 100755 => 100644 .gitlab/ci/.mk-docs-deploy.yml delete mode 100755 .gitlab/ci/.react-ui.yml mode change 100755 => 100644 .gitlab/ci/.release-container.yml mode change 100755 => 100644 .gitlab/ci/.renovate.yml mode change 100755 => 100644 .gitlab/ci/.security-and-compliance-ci.yml mode change 100755 => 100644 .gitlab/ci/.test.yml mode change 100755 => 100644 .gitlab/ci/gnmi-cert-integration.Dockerfile mode change 100755 => 100644 .gitlab/ci/gosdn-integration.Dockerfile mode change 100755 => 100644 .gitlab/ci/legacy/.test.yml mode change 100755 => 100644 .gitlab/issue_templates/Change Request.md mode change 100755 => 100644 .gitlab/issue_templates/Feature Proposal.md mode change 100755 => 100644 .gitlab/issue_templates/Issue Template.md mode change 100755 => 100644 .gitlab/merge_request_templates/Default.md mode change 100755 => 100644 .gitmodules mode change 100755 => 100644 .golangci.yml mode change 100755 => 100644 LICENSE mode change 100755 => 100644 Makefile mode change 100755 => 100644 README.md mode change 100755 => 100644 api/LICENSE mode change 100755 => 100644 api/Makefile mode change 100755 => 100644 api/README.md mode change 100755 => 100644 api/buf.gen.yaml mode change 100755 => 100644 api/buf.work.yaml mode change 100755 => 100644 api/cmd/gogen.go mode change 100755 => 100644 api/deps/buf.yaml mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/.github/workflows/ci-cpp-build-gnmi.yml mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/BUILD.bazel mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/CONTRIBUTING.md mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/LICENSE mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/README.md mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/WORKSPACE.bazel mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cache/cache.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cache/cache_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cli/cli.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cli/cli_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/cache.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/cache_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/client.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/client_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/fake/fake.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/fake/fake_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/flags/flags_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/flags/intmap.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/flags/stringlist.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/flags/stringmap.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/gnmi/client.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/gnmi/client_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/gnmi/credentials.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/notification.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/query.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/reconnect.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/reconnect_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/register.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/client/values.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/Dockerfile mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/README.md mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/cert.pem mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/example.cfg mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/key.pem mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/supervisord.conf mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.cfg mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.crt mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.key mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.cfg mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.crt mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.key mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/unparseable.cfg mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/coalesce/coalesce.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/coalesce/coalesce_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/collector/collector.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/collector/collector_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/connection/connection.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/connection/connection_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/ctree/tree.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/ctree/tree_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/errdiff/errdiff.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/errdiff/errdiff_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/errlist/errlist.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/errlist/errlist_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/gnmi_deps.bzl mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/go.mod mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/go.sum mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/latency/latency.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/latency/latency_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/manager/manager.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/manager/manager_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/manager/meta.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/manager/meta_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/match/match.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/match/match_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/metadata/metadata.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/metadata/metadata_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/metadata/yang/gnmi-collector-metadata.yang mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/path/path.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/path/path_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/collector/BUILD.bazel mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/collector/collector.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/collector/collector.proto mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2_grpc.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi/BUILD.bazel mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.proto mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2_grpc.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/BUILD.bazel mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/target/BUILD.bazel mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/target/target.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/target/target.proto mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/target/target_pb2.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/proto/target/target_pb2_grpc.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/subscribe/subscribe.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/subscribe/subscribe_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/target/target.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/target/target_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/agent.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/client.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/README.md mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/config.pb.txt mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/server.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/gen_fake_config/gen_config.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/gnmi_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.proto mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2_grpc.py mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/queue/fixed_queue.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/config_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/server_option.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/value/value.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/value/value_test.go mode change 100755 => 100644 api/deps/github.com/openconfig/gnmi/watch/watch.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/proto/target/target.pb.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go mode change 100755 => 100644 api/go/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/app/app.pb.go mode change 100755 => 100644 api/go/gosdn/app/app.pb.gw.go mode change 100755 => 100644 api/go/gosdn/app/app_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/configurationmanagement/configurationmanagement.pb.go mode change 100755 => 100644 api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go mode change 100755 => 100644 api/go/gosdn/configurationmanagement/configurationmanagement_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/conflict/conflict.pb.go mode change 100755 => 100644 api/go/gosdn/csbi/csbi.pb.go mode change 100755 => 100644 api/go/gosdn/csbi/csbi_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/networkelement/networkelement.pb.go mode change 100755 => 100644 api/go/gosdn/networkelement/networkelement.pb.gw.go mode change 100755 => 100644 api/go/gosdn/networkelement/networkelement_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/plugin-internal/plugin-internal.pb.go mode change 100755 => 100644 api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/plugin-registry/plugin-registry.pb.go mode change 100755 => 100644 api/go/gosdn/plugin-registry/plugin-registry_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/plugin/plugin.pb.go mode change 100755 => 100644 api/go/gosdn/plugin/plugin_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/pnd/pnd.pb.go mode change 100755 => 100644 api/go/gosdn/pnd/pnd.pb.gw.go mode change 100755 => 100644 api/go/gosdn/pnd/pnd_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/rbac/rbac.pb.go mode change 100755 => 100644 api/go/gosdn/rbac/rbac.pb.gw.go mode change 100755 => 100644 api/go/gosdn/rbac/rbac_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/rbac/role.pb.go mode change 100755 => 100644 api/go/gosdn/rbac/role.pb.gw.go mode change 100755 => 100644 api/go/gosdn/rbac/role_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/rbac/user.pb.go mode change 100755 => 100644 api/go/gosdn/rbac/user.pb.gw.go mode change 100755 => 100644 api/go/gosdn/rbac/user_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/southbound/southbound.pb.go mode change 100755 => 100644 api/go/gosdn/southbound/southbound_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go mode change 100755 => 100644 api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go mode change 100755 => 100644 api/go/gosdn/subscriptionmanagement/subscriptionmanagement_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/topology/link.pb.go mode change 100755 => 100644 api/go/gosdn/topology/node.pb.go mode change 100755 => 100644 api/go/gosdn/topology/port.pb.go mode change 100755 => 100644 api/go/gosdn/topology/route.pb.go mode change 100755 => 100644 api/go/gosdn/topology/routingTable.pb.go mode change 100755 => 100644 api/go/gosdn/topology/routingTable.pb.gw.go mode change 100755 => 100644 api/go/gosdn/topology/routingTable_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/topology/topology.pb.go mode change 100755 => 100644 api/go/gosdn/topology/topology.pb.gw.go mode change 100755 => 100644 api/go/gosdn/topology/topology_grpc.pb.go mode change 100755 => 100644 api/go/gosdn/transport/transport.pb.go mode change 100755 => 100644 api/openapiv2/gosdn_northbound.swagger.json mode change 100755 => 100644 api/proto/buf.lock mode change 100755 => 100644 api/proto/buf.yaml mode change 100755 => 100644 api/proto/gosdn/app/app.proto mode change 100755 => 100644 api/proto/gosdn/configurationmanagement/configurationmanagement.proto mode change 100755 => 100644 api/proto/gosdn/conflict/conflict.proto mode change 100755 => 100644 api/proto/gosdn/csbi/csbi.proto mode change 100755 => 100644 api/proto/gosdn/networkelement/networkelement.proto mode change 100755 => 100644 api/proto/gosdn/plugin-internal/plugin-internal.proto mode change 100755 => 100644 api/proto/gosdn/plugin-registry/plugin-registry.proto mode change 100755 => 100644 api/proto/gosdn/plugin/plugin.proto mode change 100755 => 100644 api/proto/gosdn/pnd/pnd.proto mode change 100755 => 100644 api/proto/gosdn/rbac/rbac.proto mode change 100755 => 100644 api/proto/gosdn/rbac/role.proto mode change 100755 => 100644 api/proto/gosdn/rbac/user.proto mode change 100755 => 100644 api/proto/gosdn/southbound/southbound.proto mode change 100755 => 100644 api/proto/gosdn/subscriptionmanagement/subscriptionmanagement.proto mode change 100755 => 100644 api/proto/gosdn/topology/link.proto mode change 100755 => 100644 api/proto/gosdn/topology/node.proto mode change 100755 => 100644 api/proto/gosdn/topology/port.proto mode change 100755 => 100644 api/proto/gosdn/topology/route.proto mode change 100755 => 100644 api/proto/gosdn/topology/routingTable.proto mode change 100755 => 100644 api/proto/gosdn/topology/topology.proto mode change 100755 => 100644 api/proto/gosdn/transport/transport.proto mode change 100755 => 100644 api/third_party/validator/validator.proto mode change 100755 => 100644 application-framework/event/event.go mode change 100755 => 100644 application-framework/event/eventService.go mode change 100755 => 100644 application-framework/event/event_test.go mode change 100755 => 100644 application-framework/event/topics.go mode change 100755 => 100644 application-framework/event/type.go mode change 100755 => 100644 application-framework/models/model-handling.go mode change 100755 => 100644 application-framework/models/model-handling_test.go mode change 100755 => 100644 application-framework/registration/registration.go mode change 100755 => 100644 applications/arista-routing-engine/app.go mode change 100755 => 100644 applications/arista-routing-engine/arista-routing-engine.Dockerfile mode change 100755 => 100644 applications/arista-routing-engine/arista-routing-engine.Dockerfile.dockerignore mode change 100755 => 100644 applications/arista-routing-engine/main.go mode change 100755 => 100644 applications/arista-routing-engine/network-element.go mode change 100755 => 100644 applications/arista-routing-engine/routing.go mode change 100755 => 100644 applications/basic-interface-monitoring/app.go mode change 100755 => 100644 applications/basic-interface-monitoring/http.go mode change 100755 => 100644 applications/basic-interface-monitoring/main.go mode change 100755 => 100644 applications/basic-interface-monitoring/network-element.go mode change 100755 => 100644 applications/basic-interface-monitoring/webpage/index.html mode change 100755 => 100644 applications/hostname-checker/app.go mode change 100755 => 100644 applications/hostname-checker/device.go mode change 100755 => 100644 applications/hostname-checker/main.go mode change 100755 => 100644 applications/inventory-manager/README.md mode change 100755 => 100644 applications/inventory-manager/config/config.go mode change 100755 => 100644 applications/inventory-manager/example.yml mode change 100755 => 100644 applications/inventory-manager/inventory-manager.Dockerfile mode change 100755 => 100644 applications/inventory-manager/inventory-manager.Dockerfile.dockerignore mode change 100755 => 100644 applications/inventory-manager/inventoryManager/inventoryManager.go mode change 100755 => 100644 applications/inventory-manager/inventoryManager/util.go mode change 100755 => 100644 applications/inventory-manager/main.go mode change 100755 => 100644 applications/venv-manager/Readme.md mode change 100755 => 100644 applications/venv-manager/containerlab/containerlab.go mode change 100755 => 100644 applications/venv-manager/links/link.go mode change 100755 => 100644 applications/venv-manager/main.go mode change 100755 => 100644 applications/venv-manager/node/node.go mode change 100755 => 100644 applications/venv-manager/port/port.go mode change 100755 => 100644 applications/venv-manager/topology/topology.go mode change 100755 => 100644 applications/venv-manager/venv-manager.Dockerfile mode change 100755 => 100644 applications/venv-manager/venv-manager.Dockerfile.dockerignore mode change 100755 => 100644 applications/venv-manager/venv-manager/venv-manager.go mode change 100755 => 100644 applications/venv-manager/yang-parser/yang-parser.go mode change 100755 => 100644 applications/ws-events/app.go mode change 100755 => 100644 applications/ws-events/main.go mode change 100755 => 100644 applications/ws-events/ws-events.Dockerfile mode change 100755 => 100644 applications/ws-events/ws-events.Dockerfile.dockerignore mode change 100755 => 100644 applications/ws-events/ws.go mode change 100755 => 100644 cli/LICENSE mode change 100755 => 100644 cli/README.md mode change 100755 => 100644 cli/adapter/PndAdapter.go mode change 100755 => 100644 cli/adapter/PndAdapter_test.go mode change 100755 => 100644 cli/build/ci/.security-and-compliance-ci.yml mode change 100755 => 100644 cli/build/ci/.test.yml mode change 100755 => 100644 cli/cli.Dockerfile mode change 100755 => 100644 cli/cli.Dockerfile.dockerignore mode change 100755 => 100644 cli/cmd/change.go mode change 100755 => 100644 cli/cmd/changeCommit.go mode change 100755 => 100644 cli/cmd/changeConfirm.go mode change 100755 => 100644 cli/cmd/changeGet.go mode change 100755 => 100644 cli/cmd/changeList.go mode change 100755 => 100644 cli/cmd/config/.gosdnc.toml mode change 100755 => 100644 cli/cmd/list.go mode change 100755 => 100644 cli/cmd/login.go mode change 100755 => 100644 cli/cmd/logout.go mode change 100755 => 100644 cli/cmd/networkElement.go mode change 100755 => 100644 cli/cmd/networkElementCreate.go mode change 100755 => 100644 cli/cmd/networkElementList.go mode change 100755 => 100644 cli/cmd/networkElementPath.go mode change 100755 => 100644 cli/cmd/networkElementPathDelete.go mode change 100755 => 100644 cli/cmd/networkElementPathGet.go mode change 100755 => 100644 cli/cmd/networkElementPathGetIntended.go mode change 100755 => 100644 cli/cmd/networkElementPathSet.go mode change 100755 => 100644 cli/cmd/networkElementRemove.go mode change 100755 => 100644 cli/cmd/networkElementShow.go mode change 100755 => 100644 cli/cmd/networkElementSubscribe.go mode change 100755 => 100644 cli/cmd/plugin.go mode change 100755 => 100644 cli/cmd/pluginList.go mode change 100755 => 100644 cli/cmd/pnd.go mode change 100755 => 100644 cli/cmd/pndCreate.go mode change 100755 => 100644 cli/cmd/pndGet.go mode change 100755 => 100644 cli/cmd/pndList.go mode change 100755 => 100644 cli/cmd/pndRemove.go mode change 100755 => 100644 cli/cmd/pndUse.go mode change 100755 => 100644 cli/cmd/prompt.go mode change 100755 => 100644 cli/cmd/role.go mode change 100755 => 100644 cli/cmd/roleCreate.go mode change 100755 => 100644 cli/cmd/roleGetAll.go mode change 100755 => 100644 cli/cmd/root.go mode change 100755 => 100644 cli/cmd/subManagement.go mode change 100755 => 100644 cli/cmd/subManagementGetAll.go mode change 100755 => 100644 cli/cmd/subManagementResetAll.go mode change 100755 => 100644 cli/cmd/user.go mode change 100755 => 100644 cli/cmd/userCreate.go mode change 100755 => 100644 cli/cmd/userDelete.go mode change 100755 => 100644 cli/cmd/userGet.go mode change 100755 => 100644 cli/cmd/userGetAll.go mode change 100755 => 100644 cli/cmd/userUpdate.go mode change 100755 => 100644 cli/cmd/utils.go mode change 100755 => 100644 cli/cmd/utils_test.go mode change 100755 => 100644 cli/completer/utils.go mode change 100755 => 100644 cli/completer/yangSchemaCompleter.go mode change 100755 => 100644 cli/config/.cobra.yaml mode change 100755 => 100644 cli/config/gosdnc.toml.example mode change 100755 => 100644 cli/main.go mode change 100755 => 100644 cli/test/containerlab/integrationtest.clab.tmpl.yml mode change 100755 => 100644 cli/test/containerlab/integrationtest_branch.clab.tmpl.yml mode change 100755 => 100644 config.js mode change 100755 => 100644 controller/ARCHITECTURE.md mode change 100755 => 100644 controller/CONTRIBUTING.md mode change 100755 => 100644 controller/Dockerfile.debug mode change 100755 => 100644 controller/Makefile mode change 100755 => 100644 controller/README.md mode change 100755 => 100644 controller/api/apiUtil_test.go mode change 100755 => 100644 controller/api/api_test.go mode change 100755 => 100644 controller/api/api_test.toml mode change 100755 => 100644 controller/api/app.go mode change 100755 => 100644 controller/api/auth.go mode change 100755 => 100644 controller/api/auth_test.go mode change 100755 => 100644 controller/api/change.go mode change 100755 => 100644 controller/api/configurationManagement.go mode change 100755 => 100644 controller/api/grpc.go mode change 100755 => 100644 controller/api/initialise_test.go mode change 100755 => 100644 controller/api/managedNetworkElement.go mode change 100755 => 100644 controller/api/plugin.go mode change 100755 => 100644 controller/api/pnd.go mode change 100755 => 100644 controller/api/role.go mode change 100755 => 100644 controller/api/role_test.go mode change 100755 => 100644 controller/api/subManagement.go mode change 100755 => 100644 controller/api/user.go mode change 100755 => 100644 controller/api/user_test.go mode change 100755 => 100644 controller/app/DatabaseStore.go mode change 100755 => 100644 controller/app/Service.go mode change 100755 => 100644 controller/app/app.go mode change 100755 => 100644 controller/app/store.go mode change 100755 => 100644 controller/app/utils.go mode change 100755 => 100644 controller/cmd/gosdn/main.go mode change 100755 => 100644 controller/cmd/root.go mode change 100755 => 100644 controller/cmd/version.go mode change 100755 => 100644 controller/config/config.go mode change 100755 => 100644 controller/config/config_test.go mode change 100755 => 100644 controller/config/environment.go mode change 100755 => 100644 controller/config/gnmiSubscriptionConfig.go mode change 100755 => 100644 controller/configs/.gitkeep mode change 100755 => 100644 controller/configs/basic-docker-compose.toml mode change 100755 => 100644 controller/configs/containerlab-gosdn.toml.example mode change 100755 => 100644 controller/configs/development-gosdn.toml.example mode change 100755 => 100644 controller/configs/gNMISubscriptions.txt.example mode change 100755 => 100644 controller/configs/integration-test-gosdn.toml mode change 100755 => 100644 controller/conflict/versioning.go mode change 100755 => 100644 controller/controller.Dockerfile mode change 100755 => 100644 controller/controller.Dockerfile.dockerignore mode change 100755 => 100644 controller/controller.go mode change 100755 => 100644 controller/controller_test.go mode change 100755 => 100644 controller/customerrs/errors.go mode change 100755 => 100644 controller/event/event.go mode change 100755 => 100644 controller/event/event_test.go mode change 100755 => 100644 controller/eventService/Service.go mode change 100755 => 100644 controller/eventService/utils.go mode change 100755 => 100644 controller/http.go mode change 100755 => 100644 controller/http_test.go mode change 100755 => 100644 controller/initialise_test.go mode change 100755 => 100644 controller/interfaces/change/change.go mode change 100755 => 100644 controller/interfaces/event/service.go mode change 100755 => 100644 controller/interfaces/networkdomain/pnd.go mode change 100755 => 100644 controller/interfaces/networkdomain/pndService.go mode change 100755 => 100644 controller/interfaces/networkdomain/pndStore.go mode change 100755 => 100644 controller/interfaces/networkelement/networkElement.go mode change 100755 => 100644 controller/interfaces/networkelement/networkElementService.go mode change 100755 => 100644 controller/interfaces/networkelement/networkElementStore.go mode change 100755 => 100644 controller/interfaces/plugin/plugin.go mode change 100755 => 100644 controller/interfaces/plugin/pluginService.go mode change 100755 => 100644 controller/interfaces/plugin/pluginStore.go mode change 100755 => 100644 controller/interfaces/rbac/rbacService.go mode change 100755 => 100644 controller/interfaces/rbac/role.go mode change 100755 => 100644 controller/interfaces/rbac/roleStore.go mode change 100755 => 100644 controller/interfaces/rbac/user.go mode change 100755 => 100644 controller/interfaces/rbac/userStore.go mode change 100755 => 100644 controller/interfaces/store/store.go mode change 100755 => 100644 controller/interfaces/transport/transport.go mode change 100755 => 100644 controller/metrics/prometheus.go mode change 100755 => 100644 controller/mocks/Change.go mode change 100755 => 100644 controller/mocks/Csbi.go mode change 100755 => 100644 controller/mocks/Device.go mode change 100755 => 100644 controller/mocks/GNMIClient.go mode change 100755 => 100644 controller/mocks/GNMIServer.go mode change 100755 => 100644 controller/mocks/GNMI_SubscribeClient.go mode change 100755 => 100644 controller/mocks/GNMI_SubscribeServer.go mode change 100755 => 100644 controller/mocks/GenericGoStructClient.go mode change 100755 => 100644 controller/mocks/HandleSubscribeResponse.go mode change 100755 => 100644 controller/mocks/NetworkDomain.go mode change 100755 => 100644 controller/mocks/NetworkElement.go mode change 100755 => 100644 controller/mocks/Plugin.go mode change 100755 => 100644 controller/mocks/PluginRegistryServiceClient.go mode change 100755 => 100644 controller/mocks/Plugin_additions.go mode change 100755 => 100644 controller/mocks/PndService.go mode change 100755 => 100644 controller/mocks/PndStore.go mode change 100755 => 100644 controller/mocks/Pnd_Additions.go mode change 100755 => 100644 controller/mocks/Role.go mode change 100755 => 100644 controller/mocks/RoleService.go mode change 100755 => 100644 controller/mocks/RoleStore.go mode change 100755 => 100644 controller/mocks/Service.go mode change 100755 => 100644 controller/mocks/Storable.go mode change 100755 => 100644 controller/mocks/Store.go mode change 100755 => 100644 controller/mocks/Transport.go mode change 100755 => 100644 controller/mocks/UnsafeGNMIServer.go mode change 100755 => 100644 controller/mocks/User.go mode change 100755 => 100644 controller/mocks/UserService.go mode change 100755 => 100644 controller/mocks/UserStore.go mode change 100755 => 100644 controller/mocks/isSubscribeRequest_Request.go mode change 100755 => 100644 controller/mocks/isSubscribeResponse_Response.go mode change 100755 => 100644 controller/mocks/isTypedValue_Value.go mode change 100755 => 100644 controller/northbound/client/app.go mode change 100755 => 100644 controller/northbound/client/configurationManagement.go mode change 100755 => 100644 controller/northbound/client/networkElement.go mode change 100755 => 100644 controller/northbound/client/plugin.go mode change 100755 => 100644 controller/northbound/client/pnd.go mode change 100755 => 100644 controller/northbound/client/rbac.go mode change 100755 => 100644 controller/northbound/client/sbi.go mode change 100755 => 100644 controller/northbound/client/submanagement.go mode change 100755 => 100644 controller/northbound/server/app.go mode change 100755 => 100644 controller/northbound/server/auth.go mode change 100755 => 100644 controller/northbound/server/auth_interceptor.go mode change 100755 => 100644 controller/northbound/server/auth_interceptor_test.go mode change 100755 => 100644 controller/northbound/server/auth_test.go mode change 100755 => 100644 controller/northbound/server/configurationmanagement.go mode change 100755 => 100644 controller/northbound/server/csbi.go mode change 100755 => 100644 controller/northbound/server/metrics.go mode change 100755 => 100644 controller/northbound/server/nbi.go mode change 100755 => 100644 controller/northbound/server/networkElement.go mode change 100755 => 100644 controller/northbound/server/networkElement_test.go mode change 100755 => 100644 controller/northbound/server/plugin.go mode change 100755 => 100644 controller/northbound/server/pnd.go mode change 100755 => 100644 controller/northbound/server/pnd_test.go mode change 100755 => 100644 controller/northbound/server/role.go mode change 100755 => 100644 controller/northbound/server/role_test.go mode change 100755 => 100644 controller/northbound/server/route.go mode change 100755 => 100644 controller/northbound/server/submanagement.go mode change 100755 => 100644 controller/northbound/server/test_util_test.go mode change 100755 => 100644 controller/northbound/server/topology.go mode change 100755 => 100644 controller/northbound/server/topology_test.go mode change 100755 => 100644 controller/northbound/server/user.go mode change 100755 => 100644 controller/northbound/server/user_test.go mode change 100755 => 100644 controller/northbound/server/utils_test.go mode change 100755 => 100644 controller/nucleus/change.go mode change 100755 => 100644 controller/nucleus/change_test.go mode change 100755 => 100644 controller/nucleus/clientConfig.go mode change 100755 => 100644 controller/nucleus/database/mongo-connection.go mode change 100755 => 100644 controller/nucleus/databaseNetworkElementStore.go mode change 100755 => 100644 controller/nucleus/databasePluginStore.go mode change 100755 => 100644 controller/nucleus/databasePndStore.go mode change 100755 => 100644 controller/nucleus/genericService.go mode change 100755 => 100644 controller/nucleus/gnmi_transport.go mode change 100755 => 100644 controller/nucleus/gnmi_transport_test.go mode change 100755 => 100644 controller/nucleus/initialise_test.go mode change 100755 => 100644 controller/nucleus/memoryNetworkElementStore.go mode change 100755 => 100644 controller/nucleus/memoryPluginStore.go mode change 100755 => 100644 controller/nucleus/memoryPndStore.go mode change 100755 => 100644 controller/nucleus/networkElement.go mode change 100755 => 100644 controller/nucleus/networkElementFilesystemStore.go mode change 100755 => 100644 controller/nucleus/networkElementFilesystemStore_test.go mode change 100755 => 100644 controller/nucleus/networkElementService.go mode change 100755 => 100644 controller/nucleus/networkElementServiceMock.go mode change 100755 => 100644 controller/nucleus/networkElementService_test.go mode change 100755 => 100644 controller/nucleus/networkElementStore.go mode change 100755 => 100644 controller/nucleus/networkElementWatcher.go mode change 100755 => 100644 controller/nucleus/networkElement_test.go mode change 100755 => 100644 controller/nucleus/plugin.go mode change 100755 => 100644 controller/nucleus/pluginFilesystemStore.go mode change 100755 => 100644 controller/nucleus/pluginFilesystemStore_test.go mode change 100755 => 100644 controller/nucleus/pluginService.go mode change 100755 => 100644 controller/nucleus/pluginServiceMock.go mode change 100755 => 100644 controller/nucleus/pluginStore.go mode change 100755 => 100644 controller/nucleus/plugin_test.go mode change 100755 => 100644 controller/nucleus/pndFilesystemStore.go mode change 100755 => 100644 controller/nucleus/pndFilesystemStore_test.go mode change 100755 => 100644 controller/nucleus/pndService.go mode change 100755 => 100644 controller/nucleus/pndStore.go mode change 100755 => 100644 controller/nucleus/principalNetworkDomain.go mode change 100755 => 100644 controller/nucleus/principalNetworkDomain_test.go mode change 100755 => 100644 controller/nucleus/restconf_transport.go mode change 100755 => 100644 controller/nucleus/restconf_transport_test.go mode change 100755 => 100644 controller/nucleus/subscriptionQueueHandler.go mode change 100755 => 100644 controller/nucleus/transport.go mode change 100755 => 100644 controller/nucleus/transport_test.go mode change 100755 => 100644 controller/nucleus/types/types.go mode change 100755 => 100644 controller/nucleus/util/gnmi/convert.go mode change 100755 => 100644 controller/nucleus/util/gnmi/notification.go mode change 100755 => 100644 controller/nucleus/util/path/translate.go mode change 100755 => 100644 controller/nucleus/util/path/traverse.go mode change 100755 => 100644 controller/nucleus/util/path/traverse_test.go mode change 100755 => 100644 controller/nucleus/util/plugin.go mode change 100755 => 100644 controller/nucleus/util/proto/message.go mode change 100755 => 100644 controller/nucleus/util/proto/message_test.go mode change 100755 => 100644 controller/plugin/shared/client.go mode change 100755 => 100644 controller/plugin/shared/interface.go mode change 100755 => 100644 controller/plugin/shared/server.go mode change 100755 => 100644 controller/plugin/shared/util.go mode change 100755 => 100644 controller/rbac/databaseRoleStore.go mode change 100755 => 100644 controller/rbac/databaseUserStore.go mode change 100755 => 100644 controller/rbac/jwtManager.go mode change 100755 => 100644 controller/rbac/jwtManager_test.go mode change 100755 => 100644 controller/rbac/memoryRoleStore.go mode change 100755 => 100644 controller/rbac/memoryUserStore.go mode change 100755 => 100644 controller/rbac/rbacService.go mode change 100755 => 100644 controller/rbac/rbacTestUtil_test.go mode change 100755 => 100644 controller/rbac/role.go mode change 100755 => 100644 controller/rbac/roleFileSystemStore.go mode change 100755 => 100644 controller/rbac/roleFileSystemStore_test.go mode change 100755 => 100644 controller/rbac/roleStore.go mode change 100755 => 100644 controller/rbac/user.go mode change 100755 => 100644 controller/rbac/userFileSystemStore.go mode change 100755 => 100644 controller/rbac/userFileSystemStore_test.go mode change 100755 => 100644 controller/rbac/userStore.go mode change 100755 => 100644 controller/store/changeStores.go mode change 100755 => 100644 controller/store/filesystem-settings.go mode change 100755 => 100644 controller/store/genericStore.go mode change 100755 => 100644 controller/store/initialise_test.go mode change 100755 => 100644 controller/store/oldGenericStore.go mode change 100755 => 100644 controller/store/query.go mode change 100755 => 100644 controller/store/storageMode.go mode change 100755 => 100644 controller/store/utils.go mode change 100755 => 100644 controller/test/arista-interface-response.json mode change 100755 => 100644 controller/test/arista-interface-response2.json mode change 100755 => 100644 controller/test/arista-root-response.json mode change 100755 => 100644 controller/test/containerlab/complex-1.0.clab.tmpl.yml mode change 100755 => 100644 controller/test/containerlab/complex-1.0.png mode change 100755 => 100644 controller/test/containerlab/dev.clab.tmpl.yml mode change 100755 => 100644 controller/test/containerlab/int01.clab.tmpl.yml mode change 100755 => 100644 controller/test/plugin/csbiAdditions.go mode change 100755 => 100644 controller/test/plugin/faulty/csbiAdditions.go mode change 100755 => 100644 controller/test/plugin/faulty/gostructs.go mode change 100755 => 100644 controller/test/plugin/faulty/plugin.yml mode change 100755 => 100644 controller/test/plugin/gostructs.go mode change 100755 => 100644 controller/test/plugin/plugin.yml mode change 100755 => 100644 controller/test/proto/cap-resp-arista-ceos mode change 100755 => 100644 controller/test/proto/req-full-node mode change 100755 => 100644 controller/test/proto/req-full-node-arista-ceos mode change 100755 => 100644 controller/test/proto/req-interfaces-arista-ceos mode change 100755 => 100644 controller/test/proto/req-interfaces-interface-arista-ceos mode change 100755 => 100644 controller/test/proto/req-interfaces-wildcard mode change 100755 => 100644 controller/test/proto/resp-full-node mode change 100755 => 100644 controller/test/proto/resp-full-node-arista-ceos mode change 100755 => 100644 controller/test/proto/resp-interfaces-arista-ceos mode change 100755 => 100644 controller/test/proto/resp-interfaces-interface-arista-ceos mode change 100755 => 100644 controller/test/proto/resp-interfaces-wildcard mode change 100755 => 100644 controller/test/proto/resp-set-system-config-hostname mode change 100755 => 100644 controller/test/targets.go mode change 100755 => 100644 controller/test/terraform/.docker/ca.pem mode change 100755 => 100644 controller/test/terraform/.docker/cert.pem mode change 100755 => 100644 controller/test/terraform/.docker/server-cert.pem mode change 100755 => 100644 controller/test/terraform/containers.tf mode change 100755 => 100644 controller/test/terraform/images.tf mode change 100755 => 100644 controller/test/terraform/main.tf mode change 100755 => 100644 controller/test/terraform/providers.tf mode change 100755 => 100644 controller/test/terraform/resources.tf mode change 100755 => 100644 controller/test/terraform/variables.tf mode change 100755 => 100644 controller/test/yang/test-module.go mode change 100755 => 100644 controller/test/yang/test.yang mode change 100755 => 100644 controller/test/yang/yang.go mode change 100755 => 100644 controller/topology/links/link.go mode change 100755 => 100644 controller/topology/nodes/databaseNodeStore.go mode change 100755 => 100644 controller/topology/nodes/node.go mode change 100755 => 100644 controller/topology/nodes/nodeService.go mode change 100755 => 100644 controller/topology/nodes/nodeService_test.go mode change 100755 => 100644 controller/topology/nodes/store.go mode change 100755 => 100644 controller/topology/ports/configuration/configuration.go mode change 100755 => 100644 controller/topology/ports/port.go mode change 100755 => 100644 controller/topology/ports/portService.go mode change 100755 => 100644 controller/topology/ports/portService_test.go mode change 100755 => 100644 controller/topology/ports/portStore.go mode change 100755 => 100644 controller/topology/ports/store.go mode change 100755 => 100644 controller/topology/routing-tables/route.go mode change 100755 => 100644 controller/topology/routing-tables/routingTable.go mode change 100755 => 100644 controller/topology/routing-tables/routingTableService.go mode change 100755 => 100644 controller/topology/routing-tables/routingTableService_test.go mode change 100755 => 100644 controller/topology/routing-tables/routingTableStore.go mode change 100755 => 100644 controller/topology/routing-tables/store.go mode change 100755 => 100644 controller/topology/store.go mode change 100755 => 100644 controller/topology/store/genericStore.go mode change 100755 => 100644 controller/topology/store/genericStore_test.go mode change 100755 => 100644 controller/topology/store/query.go mode change 100755 => 100644 controller/topology/topology.go mode change 100755 => 100644 controller/topology/topologyService.go mode change 100755 => 100644 controller/topology/topologyService_test.go mode change 100755 => 100644 controller/topology/topologyStore.go mode change 100755 => 100644 controller/version/version.go mode change 100755 => 100644 controller/version/version_test.go mode change 100755 => 100644 csbi/.csbi.yaml mode change 100755 => 100644 csbi/Dockerfile.exec mode change 100755 => 100644 csbi/LICENSE mode change 100755 => 100644 csbi/README.md mode change 100755 => 100644 csbi/arista.capabilities mode change 100755 => 100644 csbi/build.go mode change 100755 => 100644 csbi/build/ci/.build-container.yml mode change 100755 => 100644 csbi/build/ci/.code-quality-ci.yml mode change 100755 => 100644 csbi/build/ci/.golangci-config/.golangci.yml mode change 100755 => 100644 csbi/build/ci/.security-and-compliance-ci.yml mode change 100755 => 100644 csbi/build/ci/.test.yml mode change 100755 => 100644 csbi/build_test.go mode change 100755 => 100644 csbi/cmd/csbi/main.go mode change 100755 => 100644 csbi/cmd/debug/main.go mode change 100755 => 100644 csbi/cmd/demo/main.go mode change 100755 => 100644 csbi/cmd/deploy.go mode change 100755 => 100644 csbi/cmd/discover.go mode change 100755 => 100644 csbi/cmd/executor/executor.go mode change 100755 => 100644 csbi/cmd/executor/experiment.yaml mode change 100755 => 100644 csbi/cmd/generate.go mode change 100755 => 100644 csbi/cmd/hello.go mode change 100755 => 100644 csbi/cmd/init.go mode change 100755 => 100644 csbi/cmd/repository.go mode change 100755 => 100644 csbi/cmd/root.go mode change 100755 => 100644 csbi/config/config.go mode change 100755 => 100644 csbi/csbi.Dockerfile mode change 100755 => 100644 csbi/csbi.Dockerfile.dockerignore mode change 100755 => 100644 csbi/deployment.go mode change 100755 => 100644 csbi/deployment_test.go mode change 100755 => 100644 csbi/discover.go mode change 100755 => 100644 csbi/discover_test.go mode change 100755 => 100644 csbi/docker-compose.yml mode change 100755 => 100644 csbi/generate.go mode change 100755 => 100644 csbi/generate_test.go mode change 100755 => 100644 csbi/gnmi-target/gnmitarget.Dockerfile mode change 100755 => 100644 csbi/gnmi-target/gnmitarget.Dockerfile.dockerignore mode change 100755 => 100644 csbi/grafana/provisioning/datasources/prometheus_ds.yml mode change 100755 => 100644 csbi/grpc.go mode change 100755 => 100644 csbi/grpc_test.go mode change 100755 => 100644 csbi/http.go mode change 100755 => 100644 csbi/http_test.go mode change 100755 => 100644 csbi/metrics.go mode change 100755 => 100644 csbi/model.go mode change 100755 => 100644 csbi/orchestrator.go mode change 100755 => 100644 csbi/orchestrator_test.go mode change 100755 => 100644 csbi/prometheus/alerts.yml mode change 100755 => 100644 csbi/prometheus/prometheus.yml mode change 100755 => 100644 csbi/report.xml mode change 100755 => 100644 csbi/repository.go mode change 100755 => 100644 csbi/repository_test.go mode change 100755 => 100644 csbi/resources/Dockerfile mode change 100755 => 100644 csbi/resources/config.yaml mode change 100755 => 100644 csbi/resources/csbi.go mode change 100755 => 100644 csbi/resources/csbiAdditions.go mode change 100755 => 100644 csbi/resources/go.mod mode change 100755 => 100644 csbi/resources/go.sum mode change 100755 => 100644 csbi/resources/gostructs.go mode change 100755 => 100644 csbi/run.go mode change 100755 => 100644 csbi/run_test.go mode change 100755 => 100644 csbi/templates.go mode change 100755 => 100644 csbi/test.clab.yml mode change 100755 => 100644 csbi/testdata/00000000-0000-0000-0000-000000000000/gostructs.go mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/arista-cli.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/arista-eos-types.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/arista-exp-eos.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/cert/arista-gnoi-cert.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/evpn/arista-exp-eos-evpn.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/igmpsnooping/arista-exp-eos-igmpsnooping.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/l2protocolforwarding/arista-exp-eos-l2protocolforwarding.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/mlag/arista-exp-eos-mlag.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/multicast/arista-exp-eos-multicast.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/openconfig-component-counters.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-acl-config.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-config.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/rpc/arista-rpc-netconf.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-intf.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-net-inst.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/vlan/vlan-translation.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan-config.yang mode change 100755 => 100644 csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/LICENSE mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-interfaces.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-chassis.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-linecard.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-node.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-port.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-qos.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/LICENSE mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/README.md mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/acl/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/acl/openconfig-acl.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-common.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ethernet.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv4.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv6.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-mpls.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-network-instance.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-pf.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bfd/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bfd/openconfig-bfd.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-multiprotocol.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-structure.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-errors.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-global.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-neighbor.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-peer-group.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-policy.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/catalog/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-catalog-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-module-catalog.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/firewall/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-high-availability.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-link-monitoring.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-8021x.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-aggregate.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet-ext.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip-ext.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-poe.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-sdn-ext.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-tunnel.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-interfaces.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/isis/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsdb-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-policy.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-routing.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/lacp/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/lacp/openconfig-lacp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/lldp/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/local-routing/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/local-routing/openconfig-local-routing.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/macsec/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-igp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-ldp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-rsvp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-sr.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-static.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-te.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/multicast/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/network-instance/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l2.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l3.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-policy.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/openconfig-extensions.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/openflow/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-channel-monitor.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-amplifier.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-attenuator.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-terminal-device.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-common.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-connectivity.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-protection.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-wavelength-router.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-policy.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area-interface.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-common.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-global.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-lsdb.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/p4rt/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/p4rt/openconfig-p4rt.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-cpu.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-ext.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-fan.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-linecard.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-pipeline-counters.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-port.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-psu.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-software.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-transceiver.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-forwarding-policies.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-interfaces.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-path-groups.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-srte.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-policy-forwarding.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy/openconfig-policy-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/policy/openconfig-routing-policy.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/probes/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/qos/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-elements.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-interfaces.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/relay-agent/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/relay-agent/openconfig-relay-agent.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-attributes.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-ext.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-shared-attributes.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-table-attributes.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-tables.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/sampling/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/sampling/openconfig-sampling-sflow.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/segment-routing/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-rsvp-sr-ext.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-srte-policy.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/stp/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-radius.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-tacacs.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarm-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarms.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-license.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-messages.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-procmon.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-logging.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-management.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-terminal.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/system/openconfig-system.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/telemetry/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/types/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/types/openconfig-inet-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/types/openconfig-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/types/openconfig-yang-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/vlan/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan-types.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/.spec.yml mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/README.md mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-access-points.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-interfaces.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-manager.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-mac.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-phy.yang mode change 100755 => 100644 csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-types.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/acl/arista-acl-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/aft/arista-aft-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/isis/arista-isis-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/isis/arista-isis-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/local-routing/arista-local-routing-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/multicast/arista-pim-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/network-instance/arista-netinst-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-acl-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-bfd-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-bgp-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-interfaces-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-lacp-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-lldp-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-local-routing-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-messages-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-network-instance-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-platform-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-qos-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-routing-policy-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/not-supported/arista-system-notsupported-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/openflow/arista-openflow-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/policy/arista-rpol-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/policy/arista-rpol-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/qos/arista-qos-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/relay-agent/arista-relay-agent-deviations.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/system/arista-system-augments.yang mode change 100755 => 100644 csbi/testdata/models/release/openconfig/models/system/arista-system-deviations.yang mode change 100755 => 100644 csbi/testdata/models/third_party/README.md mode change 100755 => 100644 csbi/testdata/models/third_party/ietf/iana-if-type.yang mode change 100755 => 100644 csbi/testdata/models/third_party/ietf/ietf-inet-types.yang mode change 100755 => 100644 csbi/testdata/models/third_party/ietf/ietf-interfaces.yang mode change 100755 => 100644 csbi/testdata/models/third_party/ietf/ietf-yang-types.yang mode change 100755 => 100644 csbi/write.go mode change 100755 => 100644 csbi/write_test.go mode change 100755 => 100644 dev_env_data/clab/basic_one_arista.yaml mode change 100755 => 100644 dev_env_data/clab/basic_two_aristas.yaml mode change 100755 => 100644 dev_env_data/clab/basic_two_gnmi_targets.yaml mode change 100755 => 100644 dev_env_data/clab/demo.clab.yaml mode change 100755 => 100644 dev_env_data/clab/gosdn.clab.yaml mode change 100755 => 100644 dev_env_data/clab/gosdn_slim.clab.yaml mode change 100755 => 100644 dev_env_data/docker-compose/basic_docker-compose.yml mode change 100755 => 100644 dev_env_data/docker-compose/integration-test_docker-compose.yml mode change 100755 => 100644 dev_env_data/plugin-registry/plugin-store.json mode change 100755 => 100644 dev_env_data/sdn/basic_two_aristas.json mode change 100755 => 100644 docker-compose.yml mode change 100755 => 100644 docker_volume_backup/.gitkeep mode change 100755 => 100644 docs/images/logo.png mode change 100755 => 100644 docs/images/logo.svg mode change 100755 => 100644 docs/index.md mode change 100755 => 100644 documentation/README.md mode change 100755 => 100644 documentation/SUMMARY.md mode change 100755 => 100644 documentation/figures/.gitkeep mode change 100755 => 100644 documentation/figures/nucleus/.gitkeep mode change 100755 => 100644 documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio mode change 100755 => 100644 documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio.png mode change 100755 => 100644 documentation/figures/overview/.gitkeep mode change 100755 => 100644 documentation/figures/overview/updated_controller_architecture_overview.drawio mode change 100755 => 100644 documentation/figures/overview/updated_controller_architecture_overview.drawio.png mode change 100755 => 100644 documentation/figures/plugins/.gitkeep mode change 100755 => 100644 documentation/figures/plugins/plugin-device-interaction.drawio mode change 100755 => 100644 documentation/figures/plugins/plugin-device-interaction.drawio.png mode change 100755 => 100644 forks/LICENSE mode change 100755 => 100644 forks/README.md mode change 100755 => 100644 forks/goarista/gnmi/arbitration.go mode change 100755 => 100644 forks/goarista/gnmi/arbitration_test.go mode change 100755 => 100644 forks/goarista/gnmi/client.go mode change 100755 => 100644 forks/goarista/gnmi/json.go mode change 100755 => 100644 forks/goarista/gnmi/operation.go mode change 100755 => 100644 forks/goarista/gnmi/operation_test.go mode change 100755 => 100644 forks/goarista/gnmi/path.go mode change 100755 => 100644 forks/goarista/gnmi/path_test.go mode change 100755 => 100644 forks/google/README.md mode change 100755 => 100644 forks/google/gnmi/model.go mode change 100755 => 100644 forks/google/gnmi/modeldata/gostruct/gen.go mode change 100755 => 100644 forks/google/gnmi/modeldata/gostruct/generated.go.wasd mode change 100755 => 100644 forks/google/gnmi/modeldata/modeldata.go mode change 100755 => 100644 forks/google/gnmi/server.go mode change 100755 => 100644 forks/google/gnmi/server_test.go.wasd mode change 100755 => 100644 forks/google/gnmi/util.go mode change 100755 => 100644 go.mod mode change 100755 => 100644 go.sum mode change 100755 => 100644 gosdn-cli-showcase.webm mode change 100755 => 100644 integration-tests/application_tests/appUtility_test.go mode change 100755 => 100644 integration-tests/application_tests/application_test.go mode change 100755 => 100644 integration-tests/application_tests/eventAssertion_test.go mode change 100755 => 100644 integration-tests/example_tests/example_test.go mode change 100755 => 100644 integration-tests/integrationTestUtils/integrationTestUtils.go mode change 100755 => 100644 integration-tests/lab_tests/lab00_test.go mode change 100755 => 100644 integration-tests/lab_tests/labUtility_test.go mode change 100755 => 100644 integration-tests/networkElement_tests/modelUtility_test.go mode change 100755 => 100644 integration-tests/networkElement_tests/networkElement_test.go mode change 100755 => 100644 integration-tests/rbac_tests/rbac_test.go mode change 100755 => 100644 integration-tests/topology_tests/topology_test.go mode change 100755 => 100644 lab-vm/README.md mode change 100755 => 100644 lab-vm/vm-with-packer/gosdn_vm.pkr.hcl mode change 100755 => 100644 lab-vm/vm-with-packer/http/meta-data mode change 100755 => 100644 lab-vm/vm-with-packer/http/user-data mode change 100755 => 100644 lab-vm/vm-with-packer/scripts/gosdn_clone.sh mode change 100755 => 100644 lab-vm/vm-with-packer/scripts/setup.sh mode change 100755 => 100644 lab-vm/vm-with-vagrant/Vagrantfile mode change 100755 => 100644 makefiles/build/Makefile mode change 100755 => 100644 makefiles/ci/Makefile mode change 100755 => 100644 makefiles/clab/Makefile mode change 100755 => 100644 makefiles/container/Makefile mode change 100755 => 100644 makefiles/generate/Makefile mode change 100755 => 100644 mkdocs.yml mode change 100755 => 100644 models/generated/README.md mode change 100755 => 100644 models/generated/arista/additions.patch mode change 100755 => 100644 models/generated/arista/arista.go mode change 100755 => 100644 models/generated/arista/config.yaml mode change 100755 => 100644 models/generated/arista/yang.go mode change 100755 => 100644 models/generated/openconfig/additions.patch mode change 100755 => 100644 models/generated/openconfig/config.yaml mode change 100755 => 100644 models/generated/openconfig/openconfig.go mode change 100755 => 100644 models/generated/openconfig/yang.go mode change 100755 => 100644 plugin-registry/README.md mode change 100755 => 100644 plugin-registry/main.go mode change 100755 => 100644 plugin-registry/plugin-registry.Dockerfile mode change 100755 => 100644 plugin-registry/plugin-registry.Dockerfile.dockerignore mode change 100755 => 100644 plugin-registry/plugin-registry.debug.Dockerfile mode change 100755 => 100644 plugin-registry/plugin-registry.debug.Dockerfile.dockerignore mode change 100755 => 100644 plugin-registry/registry.go mode change 100755 => 100644 plugin-registry/server.go mode change 100755 => 100644 plugin-registry/store.go mode change 100755 => 100644 plugins/README.md mode change 100755 => 100644 plugins/examples/arista/cmd/main.go mode change 100755 => 100644 plugins/examples/arista/plugin.yaml mode change 100755 => 100644 plugins/examples/openconfig/cmd/main.go mode change 100755 => 100644 plugins/examples/openconfig/plugin.yaml mode change 100755 => 100644 plugins/sdk/deviceModel.go create mode 100755 react-ui/src/shared/icons/icons.ts create mode 100755 react-ui/src/shared/style/box.scss mode change 100755 => 100644 renovate.json diff --git a/.cobra.yaml b/.cobra.yaml old mode 100755 new mode 100644 diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile old mode 100755 new mode 100644 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json old mode 100755 new mode 100644 diff --git a/.dockerignore b/.dockerignore old mode 100755 new mode 100644 diff --git a/.editorconfig b/.editorconfig old mode 100755 new mode 100644 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.build-binaries.yml b/.gitlab/ci/.build-binaries.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.build-container-images.yml b/.gitlab/ci/.build-container-images.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.code-quality-ci.yml b/.gitlab/ci/.code-quality-ci.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.mk-docs-deploy.yml b/.gitlab/ci/.mk-docs-deploy.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.react-ui.yml b/.gitlab/ci/.react-ui.yml deleted file mode 100755 index 873b694c8..000000000 --- a/.gitlab/ci/.react-ui.yml +++ /dev/null @@ -1,3 +0,0 @@ -build-react-ui: - stage: build - \ No newline at end of file diff --git a/.gitlab/ci/.release-container.yml b/.gitlab/ci/.release-container.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.renovate.yml b/.gitlab/ci/.renovate.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.security-and-compliance-ci.yml b/.gitlab/ci/.security-and-compliance-ci.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/.test.yml b/.gitlab/ci/.test.yml old mode 100755 new mode 100644 diff --git a/.gitlab/ci/gnmi-cert-integration.Dockerfile b/.gitlab/ci/gnmi-cert-integration.Dockerfile old mode 100755 new mode 100644 diff --git a/.gitlab/ci/gosdn-integration.Dockerfile b/.gitlab/ci/gosdn-integration.Dockerfile old mode 100755 new mode 100644 diff --git a/.gitlab/ci/legacy/.test.yml b/.gitlab/ci/legacy/.test.yml old mode 100755 new mode 100644 diff --git a/.gitlab/issue_templates/Change Request.md b/.gitlab/issue_templates/Change Request.md old mode 100755 new mode 100644 diff --git a/.gitlab/issue_templates/Feature Proposal.md b/.gitlab/issue_templates/Feature Proposal.md old mode 100755 new mode 100644 diff --git a/.gitlab/issue_templates/Issue Template.md b/.gitlab/issue_templates/Issue Template.md old mode 100755 new mode 100644 diff --git a/.gitlab/merge_request_templates/Default.md b/.gitlab/merge_request_templates/Default.md old mode 100755 new mode 100644 diff --git a/.gitmodules b/.gitmodules old mode 100755 new mode 100644 diff --git a/.golangci.yml b/.golangci.yml old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/api/LICENSE b/api/LICENSE old mode 100755 new mode 100644 diff --git a/api/Makefile b/api/Makefile old mode 100755 new mode 100644 diff --git a/api/README.md b/api/README.md old mode 100755 new mode 100644 diff --git a/api/buf.gen.yaml b/api/buf.gen.yaml old mode 100755 new mode 100644 diff --git a/api/buf.work.yaml b/api/buf.work.yaml old mode 100755 new mode 100644 diff --git a/api/cmd/gogen.go b/api/cmd/gogen.go old mode 100755 new mode 100644 diff --git a/api/deps/buf.yaml b/api/deps/buf.yaml old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/.github/workflows/ci-cpp-build-gnmi.yml b/api/deps/github.com/openconfig/gnmi/.github/workflows/ci-cpp-build-gnmi.yml old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/BUILD.bazel old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/CONTRIBUTING.md b/api/deps/github.com/openconfig/gnmi/CONTRIBUTING.md old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/LICENSE b/api/deps/github.com/openconfig/gnmi/LICENSE old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/README.md b/api/deps/github.com/openconfig/gnmi/README.md old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/WORKSPACE.bazel b/api/deps/github.com/openconfig/gnmi/WORKSPACE.bazel old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cache/cache.go b/api/deps/github.com/openconfig/gnmi/cache/cache.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cache/cache_test.go b/api/deps/github.com/openconfig/gnmi/cache/cache_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cli/cli.go b/api/deps/github.com/openconfig/gnmi/cli/cli.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cli/cli_test.go b/api/deps/github.com/openconfig/gnmi/cli/cli_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/cache.go b/api/deps/github.com/openconfig/gnmi/client/cache.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/cache_test.go b/api/deps/github.com/openconfig/gnmi/client/cache_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/client.go b/api/deps/github.com/openconfig/gnmi/client/client.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/client_test.go b/api/deps/github.com/openconfig/gnmi/client/client_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/fake/fake.go b/api/deps/github.com/openconfig/gnmi/client/fake/fake.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/fake/fake_test.go b/api/deps/github.com/openconfig/gnmi/client/fake/fake_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/flags_test.go b/api/deps/github.com/openconfig/gnmi/client/flags/flags_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/intmap.go b/api/deps/github.com/openconfig/gnmi/client/flags/intmap.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/stringlist.go b/api/deps/github.com/openconfig/gnmi/client/flags/stringlist.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/flags/stringmap.go b/api/deps/github.com/openconfig/gnmi/client/flags/stringmap.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/gnmi/client.go b/api/deps/github.com/openconfig/gnmi/client/gnmi/client.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/gnmi/client_test.go b/api/deps/github.com/openconfig/gnmi/client/gnmi/client_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/gnmi/credentials.go b/api/deps/github.com/openconfig/gnmi/client/gnmi/credentials.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup.go b/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup_test.go b/api/deps/github.com/openconfig/gnmi/client/grpcutil/lookup_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/notification.go b/api/deps/github.com/openconfig/gnmi/client/notification.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/query.go b/api/deps/github.com/openconfig/gnmi/client/query.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/reconnect.go b/api/deps/github.com/openconfig/gnmi/client/reconnect.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/reconnect_test.go b/api/deps/github.com/openconfig/gnmi/client/reconnect_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/register.go b/api/deps/github.com/openconfig/gnmi/client/register.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/client/values.go b/api/deps/github.com/openconfig/gnmi/client/values.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli_test.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_cli/gnmi_cli_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/Dockerfile b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/Dockerfile old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/README.md b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/README.md old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/cert.pem b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/cert.pem old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/example.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/example.cfg old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/key.pem b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/config/key.pem old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/supervisord.conf b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/docker/supervisord.conf old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector_test.go b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/gnmi_collector_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.cfg old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.crt b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.crt old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.key b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/bad.key old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.cfg old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.crt b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.crt old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.key b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/good.key old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/unparseable.cfg b/api/deps/github.com/openconfig/gnmi/cmd/gnmi_collector/testdata/unparseable.cfg old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/coalesce/coalesce.go b/api/deps/github.com/openconfig/gnmi/coalesce/coalesce.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/coalesce/coalesce_test.go b/api/deps/github.com/openconfig/gnmi/coalesce/coalesce_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/collector/collector.go b/api/deps/github.com/openconfig/gnmi/collector/collector.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/collector/collector_test.go b/api/deps/github.com/openconfig/gnmi/collector/collector_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/connection/connection.go b/api/deps/github.com/openconfig/gnmi/connection/connection.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/connection/connection_test.go b/api/deps/github.com/openconfig/gnmi/connection/connection_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/ctree/tree.go b/api/deps/github.com/openconfig/gnmi/ctree/tree.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/ctree/tree_test.go b/api/deps/github.com/openconfig/gnmi/ctree/tree_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/errdiff/errdiff.go b/api/deps/github.com/openconfig/gnmi/errdiff/errdiff.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/errdiff/errdiff_test.go b/api/deps/github.com/openconfig/gnmi/errdiff/errdiff_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/errlist/errlist.go b/api/deps/github.com/openconfig/gnmi/errlist/errlist.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/errlist/errlist_test.go b/api/deps/github.com/openconfig/gnmi/errlist/errlist_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/gnmi_deps.bzl b/api/deps/github.com/openconfig/gnmi/gnmi_deps.bzl old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/go.mod b/api/deps/github.com/openconfig/gnmi/go.mod old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/go.sum b/api/deps/github.com/openconfig/gnmi/go.sum old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/latency/latency.go b/api/deps/github.com/openconfig/gnmi/latency/latency.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/latency/latency_test.go b/api/deps/github.com/openconfig/gnmi/latency/latency_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/manager/manager.go b/api/deps/github.com/openconfig/gnmi/manager/manager.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/manager/manager_test.go b/api/deps/github.com/openconfig/gnmi/manager/manager_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/manager/meta.go b/api/deps/github.com/openconfig/gnmi/manager/meta.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/manager/meta_test.go b/api/deps/github.com/openconfig/gnmi/manager/meta_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/match/match.go b/api/deps/github.com/openconfig/gnmi/match/match.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/match/match_test.go b/api/deps/github.com/openconfig/gnmi/match/match_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/metadata/metadata.go b/api/deps/github.com/openconfig/gnmi/metadata/metadata.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/metadata/metadata_test.go b/api/deps/github.com/openconfig/gnmi/metadata/metadata_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/metadata/yang/gnmi-collector-metadata.yang b/api/deps/github.com/openconfig/gnmi/metadata/yang/gnmi-collector-metadata.yang old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/path/path.go b/api/deps/github.com/openconfig/gnmi/path/path.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/path/path_test.go b/api/deps/github.com/openconfig/gnmi/path/path_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/collector/BUILD.bazel old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector.pb.go b/api/deps/github.com/openconfig/gnmi/proto/collector/collector.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector.proto b/api/deps/github.com/openconfig/gnmi/proto/collector/collector.proto old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go b/api/deps/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/collector/collector_pb2_grpc.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/gnmi/BUILD.bazel old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.proto b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi.proto old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi/gnmi_pb2_grpc.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/BUILD.bazel old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext_pb2_grpc.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/BUILD.bazel b/api/deps/github.com/openconfig/gnmi/proto/target/BUILD.bazel old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target.pb.go b/api/deps/github.com/openconfig/gnmi/proto/target/target.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target.proto b/api/deps/github.com/openconfig/gnmi/proto/target/target.proto old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2.py b/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/proto/target/target_pb2_grpc.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/subscribe/subscribe.go b/api/deps/github.com/openconfig/gnmi/subscribe/subscribe.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/subscribe/subscribe_test.go b/api/deps/github.com/openconfig/gnmi/subscribe/subscribe_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/target/target.go b/api/deps/github.com/openconfig/gnmi/target/target.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/target/target_test.go b/api/deps/github.com/openconfig/gnmi/target/target_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/agent.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/agent.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/client.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/client.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/README.md b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/README.md old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/config.pb.txt b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/config.pb.txt old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/server.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/fake_server/server.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/gen_fake_config/gen_config.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/cmd/gen_fake_config/gen_config.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/gnmi_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/gnmi/gnmi_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.proto b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake.proto old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2.py b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2_grpc.py b/api/deps/github.com/openconfig/gnmi/testing/fake/proto/fake_pb2_grpc.py old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/queue/fixed_queue.go b/api/deps/github.com/openconfig/gnmi/testing/fake/queue/fixed_queue.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue.go b/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/queue/queue_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/config_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/config_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/server_option.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/grpc/config/server_option.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls_test.go b/api/deps/github.com/openconfig/gnmi/testing/fake/testing/tls/tls_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/value/value.go b/api/deps/github.com/openconfig/gnmi/value/value.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/value/value_test.go b/api/deps/github.com/openconfig/gnmi/value/value_test.go old mode 100755 new mode 100644 diff --git a/api/deps/github.com/openconfig/gnmi/watch/watch.go b/api/deps/github.com/openconfig/gnmi/watch/watch.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go b/api/go/github.com/openconfig/gnmi/proto/collector/collector_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go old mode 100755 new mode 100644 diff --git a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/app/app.pb.go b/api/go/gosdn/app/app.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/app/app.pb.gw.go b/api/go/gosdn/app/app.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/app/app_grpc.pb.go b/api/go/gosdn/app/app_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement_grpc.pb.go b/api/go/gosdn/configurationmanagement/configurationmanagement_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/conflict/conflict.pb.go b/api/go/gosdn/conflict/conflict.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/csbi/csbi.pb.go b/api/go/gosdn/csbi/csbi.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/csbi/csbi_grpc.pb.go b/api/go/gosdn/csbi/csbi_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/networkelement/networkelement.pb.go b/api/go/gosdn/networkelement/networkelement.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/networkelement/networkelement.pb.gw.go b/api/go/gosdn/networkelement/networkelement.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/networkelement/networkelement_grpc.pb.go b/api/go/gosdn/networkelement/networkelement_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/plugin-internal/plugin-internal.pb.go b/api/go/gosdn/plugin-internal/plugin-internal.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go b/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/plugin-registry/plugin-registry.pb.go b/api/go/gosdn/plugin-registry/plugin-registry.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/plugin-registry/plugin-registry_grpc.pb.go b/api/go/gosdn/plugin-registry/plugin-registry_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/plugin/plugin.pb.go b/api/go/gosdn/plugin/plugin.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/plugin/plugin_grpc.pb.go b/api/go/gosdn/plugin/plugin_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/pnd/pnd.pb.go b/api/go/gosdn/pnd/pnd.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/pnd/pnd.pb.gw.go b/api/go/gosdn/pnd/pnd.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/pnd/pnd_grpc.pb.go b/api/go/gosdn/pnd/pnd_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/rbac.pb.go b/api/go/gosdn/rbac/rbac.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/rbac.pb.gw.go b/api/go/gosdn/rbac/rbac.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/rbac_grpc.pb.go b/api/go/gosdn/rbac/rbac_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/role.pb.go b/api/go/gosdn/rbac/role.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/role.pb.gw.go b/api/go/gosdn/rbac/role.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/role_grpc.pb.go b/api/go/gosdn/rbac/role_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/user.pb.go b/api/go/gosdn/rbac/user.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/user.pb.gw.go b/api/go/gosdn/rbac/user.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/rbac/user_grpc.pb.go b/api/go/gosdn/rbac/user_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/southbound/southbound.pb.go b/api/go/gosdn/southbound/southbound.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/southbound/southbound_grpc.pb.go b/api/go/gosdn/southbound/southbound_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement_grpc.pb.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/link.pb.go b/api/go/gosdn/topology/link.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/node.pb.go b/api/go/gosdn/topology/node.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/port.pb.go b/api/go/gosdn/topology/port.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/route.pb.go b/api/go/gosdn/topology/route.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/routingTable.pb.go b/api/go/gosdn/topology/routingTable.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/routingTable.pb.gw.go b/api/go/gosdn/topology/routingTable.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/routingTable_grpc.pb.go b/api/go/gosdn/topology/routingTable_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/topology.pb.go b/api/go/gosdn/topology/topology.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/topology.pb.gw.go b/api/go/gosdn/topology/topology.pb.gw.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/topology/topology_grpc.pb.go b/api/go/gosdn/topology/topology_grpc.pb.go old mode 100755 new mode 100644 diff --git a/api/go/gosdn/transport/transport.pb.go b/api/go/gosdn/transport/transport.pb.go old mode 100755 new mode 100644 diff --git a/api/openapiv2/gosdn_northbound.swagger.json b/api/openapiv2/gosdn_northbound.swagger.json old mode 100755 new mode 100644 diff --git a/api/proto/buf.lock b/api/proto/buf.lock old mode 100755 new mode 100644 diff --git a/api/proto/buf.yaml b/api/proto/buf.yaml old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/app/app.proto b/api/proto/gosdn/app/app.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/configurationmanagement/configurationmanagement.proto b/api/proto/gosdn/configurationmanagement/configurationmanagement.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/conflict/conflict.proto b/api/proto/gosdn/conflict/conflict.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/csbi/csbi.proto b/api/proto/gosdn/csbi/csbi.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/networkelement/networkelement.proto b/api/proto/gosdn/networkelement/networkelement.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/plugin-internal/plugin-internal.proto b/api/proto/gosdn/plugin-internal/plugin-internal.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/plugin-registry/plugin-registry.proto b/api/proto/gosdn/plugin-registry/plugin-registry.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/plugin/plugin.proto b/api/proto/gosdn/plugin/plugin.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/pnd/pnd.proto b/api/proto/gosdn/pnd/pnd.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/rbac/rbac.proto b/api/proto/gosdn/rbac/rbac.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/rbac/role.proto b/api/proto/gosdn/rbac/role.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/rbac/user.proto b/api/proto/gosdn/rbac/user.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/southbound/southbound.proto b/api/proto/gosdn/southbound/southbound.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/subscriptionmanagement/subscriptionmanagement.proto b/api/proto/gosdn/subscriptionmanagement/subscriptionmanagement.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/topology/link.proto b/api/proto/gosdn/topology/link.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/topology/node.proto b/api/proto/gosdn/topology/node.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/topology/port.proto b/api/proto/gosdn/topology/port.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/topology/route.proto b/api/proto/gosdn/topology/route.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/topology/routingTable.proto b/api/proto/gosdn/topology/routingTable.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/topology/topology.proto b/api/proto/gosdn/topology/topology.proto old mode 100755 new mode 100644 diff --git a/api/proto/gosdn/transport/transport.proto b/api/proto/gosdn/transport/transport.proto old mode 100755 new mode 100644 diff --git a/api/third_party/validator/validator.proto b/api/third_party/validator/validator.proto old mode 100755 new mode 100644 diff --git a/application-framework/event/event.go b/application-framework/event/event.go old mode 100755 new mode 100644 diff --git a/application-framework/event/eventService.go b/application-framework/event/eventService.go old mode 100755 new mode 100644 diff --git a/application-framework/event/event_test.go b/application-framework/event/event_test.go old mode 100755 new mode 100644 diff --git a/application-framework/event/topics.go b/application-framework/event/topics.go old mode 100755 new mode 100644 diff --git a/application-framework/event/type.go b/application-framework/event/type.go old mode 100755 new mode 100644 diff --git a/application-framework/models/model-handling.go b/application-framework/models/model-handling.go old mode 100755 new mode 100644 diff --git a/application-framework/models/model-handling_test.go b/application-framework/models/model-handling_test.go old mode 100755 new mode 100644 diff --git a/application-framework/registration/registration.go b/application-framework/registration/registration.go old mode 100755 new mode 100644 diff --git a/applications/arista-routing-engine/app.go b/applications/arista-routing-engine/app.go old mode 100755 new mode 100644 diff --git a/applications/arista-routing-engine/arista-routing-engine.Dockerfile b/applications/arista-routing-engine/arista-routing-engine.Dockerfile old mode 100755 new mode 100644 diff --git a/applications/arista-routing-engine/arista-routing-engine.Dockerfile.dockerignore b/applications/arista-routing-engine/arista-routing-engine.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/applications/arista-routing-engine/main.go b/applications/arista-routing-engine/main.go old mode 100755 new mode 100644 diff --git a/applications/arista-routing-engine/network-element.go b/applications/arista-routing-engine/network-element.go old mode 100755 new mode 100644 diff --git a/applications/arista-routing-engine/routing.go b/applications/arista-routing-engine/routing.go old mode 100755 new mode 100644 diff --git a/applications/basic-interface-monitoring/app.go b/applications/basic-interface-monitoring/app.go old mode 100755 new mode 100644 diff --git a/applications/basic-interface-monitoring/http.go b/applications/basic-interface-monitoring/http.go old mode 100755 new mode 100644 diff --git a/applications/basic-interface-monitoring/main.go b/applications/basic-interface-monitoring/main.go old mode 100755 new mode 100644 diff --git a/applications/basic-interface-monitoring/network-element.go b/applications/basic-interface-monitoring/network-element.go old mode 100755 new mode 100644 diff --git a/applications/basic-interface-monitoring/webpage/index.html b/applications/basic-interface-monitoring/webpage/index.html old mode 100755 new mode 100644 diff --git a/applications/hostname-checker/app.go b/applications/hostname-checker/app.go old mode 100755 new mode 100644 diff --git a/applications/hostname-checker/device.go b/applications/hostname-checker/device.go old mode 100755 new mode 100644 diff --git a/applications/hostname-checker/main.go b/applications/hostname-checker/main.go old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/README.md b/applications/inventory-manager/README.md old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/config/config.go b/applications/inventory-manager/config/config.go old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/example.yml b/applications/inventory-manager/example.yml old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/inventory-manager.Dockerfile b/applications/inventory-manager/inventory-manager.Dockerfile old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/inventory-manager.Dockerfile.dockerignore b/applications/inventory-manager/inventory-manager.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/inventoryManager/inventoryManager.go b/applications/inventory-manager/inventoryManager/inventoryManager.go old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/inventoryManager/util.go b/applications/inventory-manager/inventoryManager/util.go old mode 100755 new mode 100644 diff --git a/applications/inventory-manager/main.go b/applications/inventory-manager/main.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/Readme.md b/applications/venv-manager/Readme.md old mode 100755 new mode 100644 diff --git a/applications/venv-manager/containerlab/containerlab.go b/applications/venv-manager/containerlab/containerlab.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/links/link.go b/applications/venv-manager/links/link.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/main.go b/applications/venv-manager/main.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/node/node.go b/applications/venv-manager/node/node.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/port/port.go b/applications/venv-manager/port/port.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/topology/topology.go b/applications/venv-manager/topology/topology.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/venv-manager.Dockerfile b/applications/venv-manager/venv-manager.Dockerfile old mode 100755 new mode 100644 diff --git a/applications/venv-manager/venv-manager.Dockerfile.dockerignore b/applications/venv-manager/venv-manager.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/applications/venv-manager/venv-manager/venv-manager.go b/applications/venv-manager/venv-manager/venv-manager.go old mode 100755 new mode 100644 diff --git a/applications/venv-manager/yang-parser/yang-parser.go b/applications/venv-manager/yang-parser/yang-parser.go old mode 100755 new mode 100644 diff --git a/applications/ws-events/app.go b/applications/ws-events/app.go old mode 100755 new mode 100644 diff --git a/applications/ws-events/main.go b/applications/ws-events/main.go old mode 100755 new mode 100644 diff --git a/applications/ws-events/ws-events.Dockerfile b/applications/ws-events/ws-events.Dockerfile old mode 100755 new mode 100644 diff --git a/applications/ws-events/ws-events.Dockerfile.dockerignore b/applications/ws-events/ws-events.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/applications/ws-events/ws.go b/applications/ws-events/ws.go old mode 100755 new mode 100644 diff --git a/cli/LICENSE b/cli/LICENSE old mode 100755 new mode 100644 diff --git a/cli/README.md b/cli/README.md old mode 100755 new mode 100644 diff --git a/cli/adapter/PndAdapter.go b/cli/adapter/PndAdapter.go old mode 100755 new mode 100644 diff --git a/cli/adapter/PndAdapter_test.go b/cli/adapter/PndAdapter_test.go old mode 100755 new mode 100644 diff --git a/cli/build/ci/.security-and-compliance-ci.yml b/cli/build/ci/.security-and-compliance-ci.yml old mode 100755 new mode 100644 diff --git a/cli/build/ci/.test.yml b/cli/build/ci/.test.yml old mode 100755 new mode 100644 diff --git a/cli/cli.Dockerfile b/cli/cli.Dockerfile old mode 100755 new mode 100644 diff --git a/cli/cli.Dockerfile.dockerignore b/cli/cli.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/cli/cmd/change.go b/cli/cmd/change.go old mode 100755 new mode 100644 diff --git a/cli/cmd/changeCommit.go b/cli/cmd/changeCommit.go old mode 100755 new mode 100644 diff --git a/cli/cmd/changeConfirm.go b/cli/cmd/changeConfirm.go old mode 100755 new mode 100644 diff --git a/cli/cmd/changeGet.go b/cli/cmd/changeGet.go old mode 100755 new mode 100644 diff --git a/cli/cmd/changeList.go b/cli/cmd/changeList.go old mode 100755 new mode 100644 diff --git a/cli/cmd/config/.gosdnc.toml b/cli/cmd/config/.gosdnc.toml old mode 100755 new mode 100644 diff --git a/cli/cmd/list.go b/cli/cmd/list.go old mode 100755 new mode 100644 diff --git a/cli/cmd/login.go b/cli/cmd/login.go old mode 100755 new mode 100644 diff --git a/cli/cmd/logout.go b/cli/cmd/logout.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElement.go b/cli/cmd/networkElement.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementCreate.go b/cli/cmd/networkElementCreate.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementList.go b/cli/cmd/networkElementList.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementPath.go b/cli/cmd/networkElementPath.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementPathDelete.go b/cli/cmd/networkElementPathDelete.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementPathGet.go b/cli/cmd/networkElementPathGet.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementPathGetIntended.go b/cli/cmd/networkElementPathGetIntended.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementPathSet.go b/cli/cmd/networkElementPathSet.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementRemove.go b/cli/cmd/networkElementRemove.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementShow.go b/cli/cmd/networkElementShow.go old mode 100755 new mode 100644 diff --git a/cli/cmd/networkElementSubscribe.go b/cli/cmd/networkElementSubscribe.go old mode 100755 new mode 100644 diff --git a/cli/cmd/plugin.go b/cli/cmd/plugin.go old mode 100755 new mode 100644 diff --git a/cli/cmd/pluginList.go b/cli/cmd/pluginList.go old mode 100755 new mode 100644 diff --git a/cli/cmd/pnd.go b/cli/cmd/pnd.go old mode 100755 new mode 100644 diff --git a/cli/cmd/pndCreate.go b/cli/cmd/pndCreate.go old mode 100755 new mode 100644 diff --git a/cli/cmd/pndGet.go b/cli/cmd/pndGet.go old mode 100755 new mode 100644 diff --git a/cli/cmd/pndList.go b/cli/cmd/pndList.go old mode 100755 new mode 100644 diff --git a/cli/cmd/pndRemove.go b/cli/cmd/pndRemove.go old mode 100755 new mode 100644 diff --git a/cli/cmd/pndUse.go b/cli/cmd/pndUse.go old mode 100755 new mode 100644 diff --git a/cli/cmd/prompt.go b/cli/cmd/prompt.go old mode 100755 new mode 100644 diff --git a/cli/cmd/role.go b/cli/cmd/role.go old mode 100755 new mode 100644 diff --git a/cli/cmd/roleCreate.go b/cli/cmd/roleCreate.go old mode 100755 new mode 100644 diff --git a/cli/cmd/roleGetAll.go b/cli/cmd/roleGetAll.go old mode 100755 new mode 100644 diff --git a/cli/cmd/root.go b/cli/cmd/root.go old mode 100755 new mode 100644 diff --git a/cli/cmd/subManagement.go b/cli/cmd/subManagement.go old mode 100755 new mode 100644 diff --git a/cli/cmd/subManagementGetAll.go b/cli/cmd/subManagementGetAll.go old mode 100755 new mode 100644 diff --git a/cli/cmd/subManagementResetAll.go b/cli/cmd/subManagementResetAll.go old mode 100755 new mode 100644 diff --git a/cli/cmd/user.go b/cli/cmd/user.go old mode 100755 new mode 100644 diff --git a/cli/cmd/userCreate.go b/cli/cmd/userCreate.go old mode 100755 new mode 100644 diff --git a/cli/cmd/userDelete.go b/cli/cmd/userDelete.go old mode 100755 new mode 100644 diff --git a/cli/cmd/userGet.go b/cli/cmd/userGet.go old mode 100755 new mode 100644 diff --git a/cli/cmd/userGetAll.go b/cli/cmd/userGetAll.go old mode 100755 new mode 100644 diff --git a/cli/cmd/userUpdate.go b/cli/cmd/userUpdate.go old mode 100755 new mode 100644 diff --git a/cli/cmd/utils.go b/cli/cmd/utils.go old mode 100755 new mode 100644 diff --git a/cli/cmd/utils_test.go b/cli/cmd/utils_test.go old mode 100755 new mode 100644 diff --git a/cli/completer/utils.go b/cli/completer/utils.go old mode 100755 new mode 100644 diff --git a/cli/completer/yangSchemaCompleter.go b/cli/completer/yangSchemaCompleter.go old mode 100755 new mode 100644 diff --git a/cli/config/.cobra.yaml b/cli/config/.cobra.yaml old mode 100755 new mode 100644 diff --git a/cli/config/gosdnc.toml.example b/cli/config/gosdnc.toml.example old mode 100755 new mode 100644 diff --git a/cli/main.go b/cli/main.go old mode 100755 new mode 100644 diff --git a/cli/test/containerlab/integrationtest.clab.tmpl.yml b/cli/test/containerlab/integrationtest.clab.tmpl.yml old mode 100755 new mode 100644 diff --git a/cli/test/containerlab/integrationtest_branch.clab.tmpl.yml b/cli/test/containerlab/integrationtest_branch.clab.tmpl.yml old mode 100755 new mode 100644 diff --git a/config.js b/config.js old mode 100755 new mode 100644 diff --git a/controller/ARCHITECTURE.md b/controller/ARCHITECTURE.md old mode 100755 new mode 100644 diff --git a/controller/CONTRIBUTING.md b/controller/CONTRIBUTING.md old mode 100755 new mode 100644 diff --git a/controller/Dockerfile.debug b/controller/Dockerfile.debug old mode 100755 new mode 100644 diff --git a/controller/Makefile b/controller/Makefile old mode 100755 new mode 100644 diff --git a/controller/README.md b/controller/README.md old mode 100755 new mode 100644 diff --git a/controller/api/apiUtil_test.go b/controller/api/apiUtil_test.go old mode 100755 new mode 100644 diff --git a/controller/api/api_test.go b/controller/api/api_test.go old mode 100755 new mode 100644 diff --git a/controller/api/api_test.toml b/controller/api/api_test.toml old mode 100755 new mode 100644 diff --git a/controller/api/app.go b/controller/api/app.go old mode 100755 new mode 100644 diff --git a/controller/api/auth.go b/controller/api/auth.go old mode 100755 new mode 100644 diff --git a/controller/api/auth_test.go b/controller/api/auth_test.go old mode 100755 new mode 100644 diff --git a/controller/api/change.go b/controller/api/change.go old mode 100755 new mode 100644 diff --git a/controller/api/configurationManagement.go b/controller/api/configurationManagement.go old mode 100755 new mode 100644 diff --git a/controller/api/grpc.go b/controller/api/grpc.go old mode 100755 new mode 100644 diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go old mode 100755 new mode 100644 diff --git a/controller/api/managedNetworkElement.go b/controller/api/managedNetworkElement.go old mode 100755 new mode 100644 diff --git a/controller/api/plugin.go b/controller/api/plugin.go old mode 100755 new mode 100644 diff --git a/controller/api/pnd.go b/controller/api/pnd.go old mode 100755 new mode 100644 diff --git a/controller/api/role.go b/controller/api/role.go old mode 100755 new mode 100644 diff --git a/controller/api/role_test.go b/controller/api/role_test.go old mode 100755 new mode 100644 diff --git a/controller/api/subManagement.go b/controller/api/subManagement.go old mode 100755 new mode 100644 diff --git a/controller/api/user.go b/controller/api/user.go old mode 100755 new mode 100644 diff --git a/controller/api/user_test.go b/controller/api/user_test.go old mode 100755 new mode 100644 diff --git a/controller/app/DatabaseStore.go b/controller/app/DatabaseStore.go old mode 100755 new mode 100644 diff --git a/controller/app/Service.go b/controller/app/Service.go old mode 100755 new mode 100644 diff --git a/controller/app/app.go b/controller/app/app.go old mode 100755 new mode 100644 diff --git a/controller/app/store.go b/controller/app/store.go old mode 100755 new mode 100644 diff --git a/controller/app/utils.go b/controller/app/utils.go old mode 100755 new mode 100644 diff --git a/controller/cmd/gosdn/main.go b/controller/cmd/gosdn/main.go old mode 100755 new mode 100644 diff --git a/controller/cmd/root.go b/controller/cmd/root.go old mode 100755 new mode 100644 diff --git a/controller/cmd/version.go b/controller/cmd/version.go old mode 100755 new mode 100644 diff --git a/controller/config/config.go b/controller/config/config.go old mode 100755 new mode 100644 diff --git a/controller/config/config_test.go b/controller/config/config_test.go old mode 100755 new mode 100644 diff --git a/controller/config/environment.go b/controller/config/environment.go old mode 100755 new mode 100644 diff --git a/controller/config/gnmiSubscriptionConfig.go b/controller/config/gnmiSubscriptionConfig.go old mode 100755 new mode 100644 diff --git a/controller/configs/.gitkeep b/controller/configs/.gitkeep old mode 100755 new mode 100644 diff --git a/controller/configs/basic-docker-compose.toml b/controller/configs/basic-docker-compose.toml old mode 100755 new mode 100644 diff --git a/controller/configs/containerlab-gosdn.toml.example b/controller/configs/containerlab-gosdn.toml.example old mode 100755 new mode 100644 diff --git a/controller/configs/development-gosdn.toml.example b/controller/configs/development-gosdn.toml.example old mode 100755 new mode 100644 diff --git a/controller/configs/gNMISubscriptions.txt.example b/controller/configs/gNMISubscriptions.txt.example old mode 100755 new mode 100644 diff --git a/controller/configs/integration-test-gosdn.toml b/controller/configs/integration-test-gosdn.toml old mode 100755 new mode 100644 diff --git a/controller/conflict/versioning.go b/controller/conflict/versioning.go old mode 100755 new mode 100644 diff --git a/controller/controller.Dockerfile b/controller/controller.Dockerfile old mode 100755 new mode 100644 diff --git a/controller/controller.Dockerfile.dockerignore b/controller/controller.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/controller/controller.go b/controller/controller.go old mode 100755 new mode 100644 diff --git a/controller/controller_test.go b/controller/controller_test.go old mode 100755 new mode 100644 diff --git a/controller/customerrs/errors.go b/controller/customerrs/errors.go old mode 100755 new mode 100644 diff --git a/controller/event/event.go b/controller/event/event.go old mode 100755 new mode 100644 diff --git a/controller/event/event_test.go b/controller/event/event_test.go old mode 100755 new mode 100644 diff --git a/controller/eventService/Service.go b/controller/eventService/Service.go old mode 100755 new mode 100644 diff --git a/controller/eventService/utils.go b/controller/eventService/utils.go old mode 100755 new mode 100644 diff --git a/controller/http.go b/controller/http.go old mode 100755 new mode 100644 diff --git a/controller/http_test.go b/controller/http_test.go old mode 100755 new mode 100644 diff --git a/controller/initialise_test.go b/controller/initialise_test.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/change/change.go b/controller/interfaces/change/change.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/event/service.go b/controller/interfaces/event/service.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/networkdomain/pnd.go b/controller/interfaces/networkdomain/pnd.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/networkdomain/pndService.go b/controller/interfaces/networkdomain/pndService.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/networkdomain/pndStore.go b/controller/interfaces/networkdomain/pndStore.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/networkelement/networkElement.go b/controller/interfaces/networkelement/networkElement.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/networkelement/networkElementService.go b/controller/interfaces/networkelement/networkElementService.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/networkelement/networkElementStore.go b/controller/interfaces/networkelement/networkElementStore.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/plugin/plugin.go b/controller/interfaces/plugin/plugin.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/plugin/pluginService.go b/controller/interfaces/plugin/pluginService.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/plugin/pluginStore.go b/controller/interfaces/plugin/pluginStore.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/rbac/rbacService.go b/controller/interfaces/rbac/rbacService.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/rbac/role.go b/controller/interfaces/rbac/role.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/rbac/roleStore.go b/controller/interfaces/rbac/roleStore.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/rbac/user.go b/controller/interfaces/rbac/user.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/rbac/userStore.go b/controller/interfaces/rbac/userStore.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/store/store.go b/controller/interfaces/store/store.go old mode 100755 new mode 100644 diff --git a/controller/interfaces/transport/transport.go b/controller/interfaces/transport/transport.go old mode 100755 new mode 100644 diff --git a/controller/metrics/prometheus.go b/controller/metrics/prometheus.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Change.go b/controller/mocks/Change.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Csbi.go b/controller/mocks/Csbi.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Device.go b/controller/mocks/Device.go old mode 100755 new mode 100644 diff --git a/controller/mocks/GNMIClient.go b/controller/mocks/GNMIClient.go old mode 100755 new mode 100644 diff --git a/controller/mocks/GNMIServer.go b/controller/mocks/GNMIServer.go old mode 100755 new mode 100644 diff --git a/controller/mocks/GNMI_SubscribeClient.go b/controller/mocks/GNMI_SubscribeClient.go old mode 100755 new mode 100644 diff --git a/controller/mocks/GNMI_SubscribeServer.go b/controller/mocks/GNMI_SubscribeServer.go old mode 100755 new mode 100644 diff --git a/controller/mocks/GenericGoStructClient.go b/controller/mocks/GenericGoStructClient.go old mode 100755 new mode 100644 diff --git a/controller/mocks/HandleSubscribeResponse.go b/controller/mocks/HandleSubscribeResponse.go old mode 100755 new mode 100644 diff --git a/controller/mocks/NetworkDomain.go b/controller/mocks/NetworkDomain.go old mode 100755 new mode 100644 diff --git a/controller/mocks/NetworkElement.go b/controller/mocks/NetworkElement.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Plugin.go b/controller/mocks/Plugin.go old mode 100755 new mode 100644 diff --git a/controller/mocks/PluginRegistryServiceClient.go b/controller/mocks/PluginRegistryServiceClient.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Plugin_additions.go b/controller/mocks/Plugin_additions.go old mode 100755 new mode 100644 diff --git a/controller/mocks/PndService.go b/controller/mocks/PndService.go old mode 100755 new mode 100644 diff --git a/controller/mocks/PndStore.go b/controller/mocks/PndStore.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Pnd_Additions.go b/controller/mocks/Pnd_Additions.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Role.go b/controller/mocks/Role.go old mode 100755 new mode 100644 diff --git a/controller/mocks/RoleService.go b/controller/mocks/RoleService.go old mode 100755 new mode 100644 diff --git a/controller/mocks/RoleStore.go b/controller/mocks/RoleStore.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Service.go b/controller/mocks/Service.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Storable.go b/controller/mocks/Storable.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Store.go b/controller/mocks/Store.go old mode 100755 new mode 100644 diff --git a/controller/mocks/Transport.go b/controller/mocks/Transport.go old mode 100755 new mode 100644 diff --git a/controller/mocks/UnsafeGNMIServer.go b/controller/mocks/UnsafeGNMIServer.go old mode 100755 new mode 100644 diff --git a/controller/mocks/User.go b/controller/mocks/User.go old mode 100755 new mode 100644 diff --git a/controller/mocks/UserService.go b/controller/mocks/UserService.go old mode 100755 new mode 100644 diff --git a/controller/mocks/UserStore.go b/controller/mocks/UserStore.go old mode 100755 new mode 100644 diff --git a/controller/mocks/isSubscribeRequest_Request.go b/controller/mocks/isSubscribeRequest_Request.go old mode 100755 new mode 100644 diff --git a/controller/mocks/isSubscribeResponse_Response.go b/controller/mocks/isSubscribeResponse_Response.go old mode 100755 new mode 100644 diff --git a/controller/mocks/isTypedValue_Value.go b/controller/mocks/isTypedValue_Value.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/app.go b/controller/northbound/client/app.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/configurationManagement.go b/controller/northbound/client/configurationManagement.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/networkElement.go b/controller/northbound/client/networkElement.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/plugin.go b/controller/northbound/client/plugin.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/pnd.go b/controller/northbound/client/pnd.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/rbac.go b/controller/northbound/client/rbac.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/sbi.go b/controller/northbound/client/sbi.go old mode 100755 new mode 100644 diff --git a/controller/northbound/client/submanagement.go b/controller/northbound/client/submanagement.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/app.go b/controller/northbound/server/app.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/auth.go b/controller/northbound/server/auth.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/auth_interceptor.go b/controller/northbound/server/auth_interceptor.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/auth_test.go b/controller/northbound/server/auth_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/configurationmanagement.go b/controller/northbound/server/configurationmanagement.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/csbi.go b/controller/northbound/server/csbi.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/metrics.go b/controller/northbound/server/metrics.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/networkElement_test.go b/controller/northbound/server/networkElement_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/plugin.go b/controller/northbound/server/plugin.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/role.go b/controller/northbound/server/role.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/role_test.go b/controller/northbound/server/role_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/route.go b/controller/northbound/server/route.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/submanagement.go b/controller/northbound/server/submanagement.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/test_util_test.go b/controller/northbound/server/test_util_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/topology.go b/controller/northbound/server/topology.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/topology_test.go b/controller/northbound/server/topology_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/user.go b/controller/northbound/server/user.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/user_test.go b/controller/northbound/server/user_test.go old mode 100755 new mode 100644 diff --git a/controller/northbound/server/utils_test.go b/controller/northbound/server/utils_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/change.go b/controller/nucleus/change.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/change_test.go b/controller/nucleus/change_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/clientConfig.go b/controller/nucleus/clientConfig.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/database/mongo-connection.go b/controller/nucleus/database/mongo-connection.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/databaseNetworkElementStore.go b/controller/nucleus/databaseNetworkElementStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/databasePluginStore.go b/controller/nucleus/databasePluginStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/databasePndStore.go b/controller/nucleus/databasePndStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/genericService.go b/controller/nucleus/genericService.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/gnmi_transport.go b/controller/nucleus/gnmi_transport.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/gnmi_transport_test.go b/controller/nucleus/gnmi_transport_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/memoryNetworkElementStore.go b/controller/nucleus/memoryNetworkElementStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/memoryPluginStore.go b/controller/nucleus/memoryPluginStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/memoryPndStore.go b/controller/nucleus/memoryPndStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElement.go b/controller/nucleus/networkElement.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElementFilesystemStore.go b/controller/nucleus/networkElementFilesystemStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElementFilesystemStore_test.go b/controller/nucleus/networkElementFilesystemStore_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElementService.go b/controller/nucleus/networkElementService.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElementServiceMock.go b/controller/nucleus/networkElementServiceMock.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElementService_test.go b/controller/nucleus/networkElementService_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElementStore.go b/controller/nucleus/networkElementStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/networkElement_test.go b/controller/nucleus/networkElement_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/plugin.go b/controller/nucleus/plugin.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pluginFilesystemStore.go b/controller/nucleus/pluginFilesystemStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pluginFilesystemStore_test.go b/controller/nucleus/pluginFilesystemStore_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pluginService.go b/controller/nucleus/pluginService.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pluginServiceMock.go b/controller/nucleus/pluginServiceMock.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pluginStore.go b/controller/nucleus/pluginStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/plugin_test.go b/controller/nucleus/plugin_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pndFilesystemStore.go b/controller/nucleus/pndFilesystemStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pndFilesystemStore_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pndService.go b/controller/nucleus/pndService.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/pndStore.go b/controller/nucleus/pndStore.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/principalNetworkDomain.go b/controller/nucleus/principalNetworkDomain.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/principalNetworkDomain_test.go b/controller/nucleus/principalNetworkDomain_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/restconf_transport.go b/controller/nucleus/restconf_transport.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/restconf_transport_test.go b/controller/nucleus/restconf_transport_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/subscriptionQueueHandler.go b/controller/nucleus/subscriptionQueueHandler.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/transport.go b/controller/nucleus/transport.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/transport_test.go b/controller/nucleus/transport_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/types/types.go b/controller/nucleus/types/types.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/gnmi/convert.go b/controller/nucleus/util/gnmi/convert.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/gnmi/notification.go b/controller/nucleus/util/gnmi/notification.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/path/translate.go b/controller/nucleus/util/path/translate.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/path/traverse.go b/controller/nucleus/util/path/traverse.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/path/traverse_test.go b/controller/nucleus/util/path/traverse_test.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/plugin.go b/controller/nucleus/util/plugin.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/proto/message.go b/controller/nucleus/util/proto/message.go old mode 100755 new mode 100644 diff --git a/controller/nucleus/util/proto/message_test.go b/controller/nucleus/util/proto/message_test.go old mode 100755 new mode 100644 diff --git a/controller/plugin/shared/client.go b/controller/plugin/shared/client.go old mode 100755 new mode 100644 diff --git a/controller/plugin/shared/interface.go b/controller/plugin/shared/interface.go old mode 100755 new mode 100644 diff --git a/controller/plugin/shared/server.go b/controller/plugin/shared/server.go old mode 100755 new mode 100644 diff --git a/controller/plugin/shared/util.go b/controller/plugin/shared/util.go old mode 100755 new mode 100644 diff --git a/controller/rbac/databaseRoleStore.go b/controller/rbac/databaseRoleStore.go old mode 100755 new mode 100644 diff --git a/controller/rbac/databaseUserStore.go b/controller/rbac/databaseUserStore.go old mode 100755 new mode 100644 diff --git a/controller/rbac/jwtManager.go b/controller/rbac/jwtManager.go old mode 100755 new mode 100644 diff --git a/controller/rbac/jwtManager_test.go b/controller/rbac/jwtManager_test.go old mode 100755 new mode 100644 diff --git a/controller/rbac/memoryRoleStore.go b/controller/rbac/memoryRoleStore.go old mode 100755 new mode 100644 diff --git a/controller/rbac/memoryUserStore.go b/controller/rbac/memoryUserStore.go old mode 100755 new mode 100644 diff --git a/controller/rbac/rbacService.go b/controller/rbac/rbacService.go old mode 100755 new mode 100644 diff --git a/controller/rbac/rbacTestUtil_test.go b/controller/rbac/rbacTestUtil_test.go old mode 100755 new mode 100644 diff --git a/controller/rbac/role.go b/controller/rbac/role.go old mode 100755 new mode 100644 diff --git a/controller/rbac/roleFileSystemStore.go b/controller/rbac/roleFileSystemStore.go old mode 100755 new mode 100644 diff --git a/controller/rbac/roleFileSystemStore_test.go b/controller/rbac/roleFileSystemStore_test.go old mode 100755 new mode 100644 diff --git a/controller/rbac/roleStore.go b/controller/rbac/roleStore.go old mode 100755 new mode 100644 diff --git a/controller/rbac/user.go b/controller/rbac/user.go old mode 100755 new mode 100644 diff --git a/controller/rbac/userFileSystemStore.go b/controller/rbac/userFileSystemStore.go old mode 100755 new mode 100644 diff --git a/controller/rbac/userFileSystemStore_test.go b/controller/rbac/userFileSystemStore_test.go old mode 100755 new mode 100644 diff --git a/controller/rbac/userStore.go b/controller/rbac/userStore.go old mode 100755 new mode 100644 diff --git a/controller/store/changeStores.go b/controller/store/changeStores.go old mode 100755 new mode 100644 diff --git a/controller/store/filesystem-settings.go b/controller/store/filesystem-settings.go old mode 100755 new mode 100644 diff --git a/controller/store/genericStore.go b/controller/store/genericStore.go old mode 100755 new mode 100644 diff --git a/controller/store/initialise_test.go b/controller/store/initialise_test.go old mode 100755 new mode 100644 diff --git a/controller/store/oldGenericStore.go b/controller/store/oldGenericStore.go old mode 100755 new mode 100644 diff --git a/controller/store/query.go b/controller/store/query.go old mode 100755 new mode 100644 diff --git a/controller/store/storageMode.go b/controller/store/storageMode.go old mode 100755 new mode 100644 diff --git a/controller/store/utils.go b/controller/store/utils.go old mode 100755 new mode 100644 diff --git a/controller/test/arista-interface-response.json b/controller/test/arista-interface-response.json old mode 100755 new mode 100644 diff --git a/controller/test/arista-interface-response2.json b/controller/test/arista-interface-response2.json old mode 100755 new mode 100644 diff --git a/controller/test/arista-root-response.json b/controller/test/arista-root-response.json old mode 100755 new mode 100644 diff --git a/controller/test/containerlab/complex-1.0.clab.tmpl.yml b/controller/test/containerlab/complex-1.0.clab.tmpl.yml old mode 100755 new mode 100644 diff --git a/controller/test/containerlab/complex-1.0.png b/controller/test/containerlab/complex-1.0.png old mode 100755 new mode 100644 diff --git a/controller/test/containerlab/dev.clab.tmpl.yml b/controller/test/containerlab/dev.clab.tmpl.yml old mode 100755 new mode 100644 diff --git a/controller/test/containerlab/int01.clab.tmpl.yml b/controller/test/containerlab/int01.clab.tmpl.yml old mode 100755 new mode 100644 diff --git a/controller/test/plugin/csbiAdditions.go b/controller/test/plugin/csbiAdditions.go old mode 100755 new mode 100644 diff --git a/controller/test/plugin/faulty/csbiAdditions.go b/controller/test/plugin/faulty/csbiAdditions.go old mode 100755 new mode 100644 diff --git a/controller/test/plugin/faulty/gostructs.go b/controller/test/plugin/faulty/gostructs.go old mode 100755 new mode 100644 diff --git a/controller/test/plugin/faulty/plugin.yml b/controller/test/plugin/faulty/plugin.yml old mode 100755 new mode 100644 diff --git a/controller/test/plugin/gostructs.go b/controller/test/plugin/gostructs.go old mode 100755 new mode 100644 diff --git a/controller/test/plugin/plugin.yml b/controller/test/plugin/plugin.yml old mode 100755 new mode 100644 diff --git a/controller/test/proto/cap-resp-arista-ceos b/controller/test/proto/cap-resp-arista-ceos old mode 100755 new mode 100644 diff --git a/controller/test/proto/req-full-node b/controller/test/proto/req-full-node old mode 100755 new mode 100644 diff --git a/controller/test/proto/req-full-node-arista-ceos b/controller/test/proto/req-full-node-arista-ceos old mode 100755 new mode 100644 diff --git a/controller/test/proto/req-interfaces-arista-ceos b/controller/test/proto/req-interfaces-arista-ceos old mode 100755 new mode 100644 diff --git a/controller/test/proto/req-interfaces-interface-arista-ceos b/controller/test/proto/req-interfaces-interface-arista-ceos old mode 100755 new mode 100644 diff --git a/controller/test/proto/req-interfaces-wildcard b/controller/test/proto/req-interfaces-wildcard old mode 100755 new mode 100644 diff --git a/controller/test/proto/resp-full-node b/controller/test/proto/resp-full-node old mode 100755 new mode 100644 diff --git a/controller/test/proto/resp-full-node-arista-ceos b/controller/test/proto/resp-full-node-arista-ceos old mode 100755 new mode 100644 diff --git a/controller/test/proto/resp-interfaces-arista-ceos b/controller/test/proto/resp-interfaces-arista-ceos old mode 100755 new mode 100644 diff --git a/controller/test/proto/resp-interfaces-interface-arista-ceos b/controller/test/proto/resp-interfaces-interface-arista-ceos old mode 100755 new mode 100644 diff --git a/controller/test/proto/resp-interfaces-wildcard b/controller/test/proto/resp-interfaces-wildcard old mode 100755 new mode 100644 diff --git a/controller/test/proto/resp-set-system-config-hostname b/controller/test/proto/resp-set-system-config-hostname old mode 100755 new mode 100644 diff --git a/controller/test/targets.go b/controller/test/targets.go old mode 100755 new mode 100644 diff --git a/controller/test/terraform/.docker/ca.pem b/controller/test/terraform/.docker/ca.pem old mode 100755 new mode 100644 diff --git a/controller/test/terraform/.docker/cert.pem b/controller/test/terraform/.docker/cert.pem old mode 100755 new mode 100644 diff --git a/controller/test/terraform/.docker/server-cert.pem b/controller/test/terraform/.docker/server-cert.pem old mode 100755 new mode 100644 diff --git a/controller/test/terraform/containers.tf b/controller/test/terraform/containers.tf old mode 100755 new mode 100644 diff --git a/controller/test/terraform/images.tf b/controller/test/terraform/images.tf old mode 100755 new mode 100644 diff --git a/controller/test/terraform/main.tf b/controller/test/terraform/main.tf old mode 100755 new mode 100644 diff --git a/controller/test/terraform/providers.tf b/controller/test/terraform/providers.tf old mode 100755 new mode 100644 diff --git a/controller/test/terraform/resources.tf b/controller/test/terraform/resources.tf old mode 100755 new mode 100644 diff --git a/controller/test/terraform/variables.tf b/controller/test/terraform/variables.tf old mode 100755 new mode 100644 diff --git a/controller/test/yang/test-module.go b/controller/test/yang/test-module.go old mode 100755 new mode 100644 diff --git a/controller/test/yang/test.yang b/controller/test/yang/test.yang old mode 100755 new mode 100644 diff --git a/controller/test/yang/yang.go b/controller/test/yang/yang.go old mode 100755 new mode 100644 diff --git a/controller/topology/links/link.go b/controller/topology/links/link.go old mode 100755 new mode 100644 diff --git a/controller/topology/nodes/databaseNodeStore.go b/controller/topology/nodes/databaseNodeStore.go old mode 100755 new mode 100644 diff --git a/controller/topology/nodes/node.go b/controller/topology/nodes/node.go old mode 100755 new mode 100644 diff --git a/controller/topology/nodes/nodeService.go b/controller/topology/nodes/nodeService.go old mode 100755 new mode 100644 diff --git a/controller/topology/nodes/nodeService_test.go b/controller/topology/nodes/nodeService_test.go old mode 100755 new mode 100644 diff --git a/controller/topology/nodes/store.go b/controller/topology/nodes/store.go old mode 100755 new mode 100644 diff --git a/controller/topology/ports/configuration/configuration.go b/controller/topology/ports/configuration/configuration.go old mode 100755 new mode 100644 diff --git a/controller/topology/ports/port.go b/controller/topology/ports/port.go old mode 100755 new mode 100644 diff --git a/controller/topology/ports/portService.go b/controller/topology/ports/portService.go old mode 100755 new mode 100644 diff --git a/controller/topology/ports/portService_test.go b/controller/topology/ports/portService_test.go old mode 100755 new mode 100644 diff --git a/controller/topology/ports/portStore.go b/controller/topology/ports/portStore.go old mode 100755 new mode 100644 diff --git a/controller/topology/ports/store.go b/controller/topology/ports/store.go old mode 100755 new mode 100644 diff --git a/controller/topology/routing-tables/route.go b/controller/topology/routing-tables/route.go old mode 100755 new mode 100644 diff --git a/controller/topology/routing-tables/routingTable.go b/controller/topology/routing-tables/routingTable.go old mode 100755 new mode 100644 diff --git a/controller/topology/routing-tables/routingTableService.go b/controller/topology/routing-tables/routingTableService.go old mode 100755 new mode 100644 diff --git a/controller/topology/routing-tables/routingTableService_test.go b/controller/topology/routing-tables/routingTableService_test.go old mode 100755 new mode 100644 diff --git a/controller/topology/routing-tables/routingTableStore.go b/controller/topology/routing-tables/routingTableStore.go old mode 100755 new mode 100644 diff --git a/controller/topology/routing-tables/store.go b/controller/topology/routing-tables/store.go old mode 100755 new mode 100644 diff --git a/controller/topology/store.go b/controller/topology/store.go old mode 100755 new mode 100644 diff --git a/controller/topology/store/genericStore.go b/controller/topology/store/genericStore.go old mode 100755 new mode 100644 diff --git a/controller/topology/store/genericStore_test.go b/controller/topology/store/genericStore_test.go old mode 100755 new mode 100644 diff --git a/controller/topology/store/query.go b/controller/topology/store/query.go old mode 100755 new mode 100644 diff --git a/controller/topology/topology.go b/controller/topology/topology.go old mode 100755 new mode 100644 diff --git a/controller/topology/topologyService.go b/controller/topology/topologyService.go old mode 100755 new mode 100644 diff --git a/controller/topology/topologyService_test.go b/controller/topology/topologyService_test.go old mode 100755 new mode 100644 diff --git a/controller/topology/topologyStore.go b/controller/topology/topologyStore.go old mode 100755 new mode 100644 diff --git a/controller/version/version.go b/controller/version/version.go old mode 100755 new mode 100644 diff --git a/controller/version/version_test.go b/controller/version/version_test.go old mode 100755 new mode 100644 diff --git a/csbi/.csbi.yaml b/csbi/.csbi.yaml old mode 100755 new mode 100644 diff --git a/csbi/Dockerfile.exec b/csbi/Dockerfile.exec old mode 100755 new mode 100644 diff --git a/csbi/LICENSE b/csbi/LICENSE old mode 100755 new mode 100644 diff --git a/csbi/README.md b/csbi/README.md old mode 100755 new mode 100644 diff --git a/csbi/arista.capabilities b/csbi/arista.capabilities old mode 100755 new mode 100644 diff --git a/csbi/build.go b/csbi/build.go old mode 100755 new mode 100644 diff --git a/csbi/build/ci/.build-container.yml b/csbi/build/ci/.build-container.yml old mode 100755 new mode 100644 diff --git a/csbi/build/ci/.code-quality-ci.yml b/csbi/build/ci/.code-quality-ci.yml old mode 100755 new mode 100644 diff --git a/csbi/build/ci/.golangci-config/.golangci.yml b/csbi/build/ci/.golangci-config/.golangci.yml old mode 100755 new mode 100644 diff --git a/csbi/build/ci/.security-and-compliance-ci.yml b/csbi/build/ci/.security-and-compliance-ci.yml old mode 100755 new mode 100644 diff --git a/csbi/build/ci/.test.yml b/csbi/build/ci/.test.yml old mode 100755 new mode 100644 diff --git a/csbi/build_test.go b/csbi/build_test.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/csbi/main.go b/csbi/cmd/csbi/main.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/debug/main.go b/csbi/cmd/debug/main.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/demo/main.go b/csbi/cmd/demo/main.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/deploy.go b/csbi/cmd/deploy.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/discover.go b/csbi/cmd/discover.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/executor/executor.go b/csbi/cmd/executor/executor.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/executor/experiment.yaml b/csbi/cmd/executor/experiment.yaml old mode 100755 new mode 100644 diff --git a/csbi/cmd/generate.go b/csbi/cmd/generate.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/hello.go b/csbi/cmd/hello.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/init.go b/csbi/cmd/init.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/repository.go b/csbi/cmd/repository.go old mode 100755 new mode 100644 diff --git a/csbi/cmd/root.go b/csbi/cmd/root.go old mode 100755 new mode 100644 diff --git a/csbi/config/config.go b/csbi/config/config.go old mode 100755 new mode 100644 diff --git a/csbi/csbi.Dockerfile b/csbi/csbi.Dockerfile old mode 100755 new mode 100644 diff --git a/csbi/csbi.Dockerfile.dockerignore b/csbi/csbi.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/csbi/deployment.go b/csbi/deployment.go old mode 100755 new mode 100644 diff --git a/csbi/deployment_test.go b/csbi/deployment_test.go old mode 100755 new mode 100644 diff --git a/csbi/discover.go b/csbi/discover.go old mode 100755 new mode 100644 diff --git a/csbi/discover_test.go b/csbi/discover_test.go old mode 100755 new mode 100644 diff --git a/csbi/docker-compose.yml b/csbi/docker-compose.yml old mode 100755 new mode 100644 diff --git a/csbi/generate.go b/csbi/generate.go old mode 100755 new mode 100644 diff --git a/csbi/generate_test.go b/csbi/generate_test.go old mode 100755 new mode 100644 diff --git a/csbi/gnmi-target/gnmitarget.Dockerfile b/csbi/gnmi-target/gnmitarget.Dockerfile old mode 100755 new mode 100644 diff --git a/csbi/gnmi-target/gnmitarget.Dockerfile.dockerignore b/csbi/gnmi-target/gnmitarget.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/csbi/grafana/provisioning/datasources/prometheus_ds.yml b/csbi/grafana/provisioning/datasources/prometheus_ds.yml old mode 100755 new mode 100644 diff --git a/csbi/grpc.go b/csbi/grpc.go old mode 100755 new mode 100644 diff --git a/csbi/grpc_test.go b/csbi/grpc_test.go old mode 100755 new mode 100644 diff --git a/csbi/http.go b/csbi/http.go old mode 100755 new mode 100644 diff --git a/csbi/http_test.go b/csbi/http_test.go old mode 100755 new mode 100644 diff --git a/csbi/metrics.go b/csbi/metrics.go old mode 100755 new mode 100644 diff --git a/csbi/model.go b/csbi/model.go old mode 100755 new mode 100644 diff --git a/csbi/orchestrator.go b/csbi/orchestrator.go old mode 100755 new mode 100644 diff --git a/csbi/orchestrator_test.go b/csbi/orchestrator_test.go old mode 100755 new mode 100644 diff --git a/csbi/prometheus/alerts.yml b/csbi/prometheus/alerts.yml old mode 100755 new mode 100644 diff --git a/csbi/prometheus/prometheus.yml b/csbi/prometheus/prometheus.yml old mode 100755 new mode 100644 diff --git a/csbi/report.xml b/csbi/report.xml old mode 100755 new mode 100644 diff --git a/csbi/repository.go b/csbi/repository.go old mode 100755 new mode 100644 diff --git a/csbi/repository_test.go b/csbi/repository_test.go old mode 100755 new mode 100644 diff --git a/csbi/resources/Dockerfile b/csbi/resources/Dockerfile old mode 100755 new mode 100644 diff --git a/csbi/resources/config.yaml b/csbi/resources/config.yaml old mode 100755 new mode 100644 diff --git a/csbi/resources/csbi.go b/csbi/resources/csbi.go old mode 100755 new mode 100644 diff --git a/csbi/resources/csbiAdditions.go b/csbi/resources/csbiAdditions.go old mode 100755 new mode 100644 diff --git a/csbi/resources/go.mod b/csbi/resources/go.mod old mode 100755 new mode 100644 diff --git a/csbi/resources/go.sum b/csbi/resources/go.sum old mode 100755 new mode 100644 diff --git a/csbi/resources/gostructs.go b/csbi/resources/gostructs.go old mode 100755 new mode 100644 diff --git a/csbi/run.go b/csbi/run.go old mode 100755 new mode 100644 diff --git a/csbi/run_test.go b/csbi/run_test.go old mode 100755 new mode 100644 diff --git a/csbi/templates.go b/csbi/templates.go old mode 100755 new mode 100644 diff --git a/csbi/test.clab.yml b/csbi/test.clab.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/00000000-0000-0000-0000-000000000000/gostructs.go b/csbi/testdata/00000000-0000-0000-0000-000000000000/gostructs.go old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/arista-cli.yang b/csbi/testdata/models/experimental/eos/models/arista-cli.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/arista-eos-types.yang b/csbi/testdata/models/experimental/eos/models/arista-eos-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/arista-exp-eos.yang b/csbi/testdata/models/experimental/eos/models/arista-exp-eos.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/cert/arista-gnoi-cert.yang b/csbi/testdata/models/experimental/eos/models/cert/arista-gnoi-cert.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/evpn/arista-exp-eos-evpn.yang b/csbi/testdata/models/experimental/eos/models/evpn/arista-exp-eos-evpn.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/igmpsnooping/arista-exp-eos-igmpsnooping.yang b/csbi/testdata/models/experimental/eos/models/igmpsnooping/arista-exp-eos-igmpsnooping.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/l2protocolforwarding/arista-exp-eos-l2protocolforwarding.yang b/csbi/testdata/models/experimental/eos/models/l2protocolforwarding/arista-exp-eos-l2protocolforwarding.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/mlag/arista-exp-eos-mlag.yang b/csbi/testdata/models/experimental/eos/models/mlag/arista-exp-eos-mlag.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/multicast/arista-exp-eos-multicast.yang b/csbi/testdata/models/experimental/eos/models/multicast/arista-exp-eos-multicast.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/openconfig-component-counters.yang b/csbi/testdata/models/experimental/eos/models/openconfig-component-counters.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-acl-config.yang b/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-acl-config.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-config.yang b/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos-config.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos.yang b/csbi/testdata/models/experimental/eos/models/qos/arista-exp-eos-qos.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/rpc/arista-rpc-netconf.yang b/csbi/testdata/models/experimental/eos/models/rpc/arista-rpc-netconf.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-intf.yang b/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-intf.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-net-inst.yang b/csbi/testdata/models/experimental/eos/models/varp/arista-exp-eos-varp-net-inst.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/vlan/vlan-translation.yang b/csbi/testdata/models/experimental/eos/models/vlan/vlan-translation.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan-config.yang b/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan-config.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan.yang b/csbi/testdata/models/experimental/eos/models/vxlan/arista-exp-eos-vxlan.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/LICENSE b/csbi/testdata/models/openconfig/hercules/LICENSE old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-interfaces.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-interfaces.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-chassis.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-chassis.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-linecard.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-linecard.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-node.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-node.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-port.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform-port.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-platform.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-qos.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules-qos.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules.yang b/csbi/testdata/models/openconfig/hercules/yang/openconfig-hercules.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/LICENSE b/csbi/testdata/models/openconfig/public/LICENSE old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/README.md b/csbi/testdata/models/openconfig/public/release/README.md old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/acl/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-acl.yang b/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-acl.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match-types.yang b/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match.yang b/csbi/testdata/models/openconfig/public/release/models/acl/openconfig-packet-match.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/aft/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-common.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-common.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ethernet.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ethernet.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv4.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv4.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv6.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-ipv6.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-mpls.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-mpls.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-network-instance.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-network-instance.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-pf.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-pf.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-types.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft.yang b/csbi/testdata/models/openconfig/public/release/models/aft/openconfig-aft.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bfd/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/bfd/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bfd/openconfig-bfd.yang b/csbi/testdata/models/openconfig/public/release/models/bfd/openconfig-bfd.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/bgp/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-multiprotocol.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-multiprotocol.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-structure.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common-structure.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-common.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-errors.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-errors.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-global.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-global.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-neighbor.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-neighbor.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-peer-group.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-peer-group.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-policy.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-policy.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-types.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp.yang b/csbi/testdata/models/openconfig/public/release/models/bgp/openconfig-bgp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/catalog/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/catalog/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-catalog-types.yang b/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-catalog-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-module-catalog.yang b/csbi/testdata/models/openconfig/public/release/models/catalog/openconfig-module-catalog.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/firewall/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/firewall/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-high-availability.yang b/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-high-availability.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-link-monitoring.yang b/csbi/testdata/models/openconfig/public/release/models/firewall/openconfig-fw-link-monitoring.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/interfaces/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-8021x.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-8021x.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-aggregate.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-aggregate.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet-ext.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet-ext.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ethernet.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip-ext.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip-ext.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-ip.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-poe.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-poe.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-sdn-ext.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-sdn-ext.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-tunnel.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-tunnel.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-types.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-if-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/interfaces/openconfig-interfaces.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/isis/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsdb-types.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsdb-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsp.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-lsp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-policy.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-policy.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-routing.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-routing.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-types.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis.yang b/csbi/testdata/models/openconfig/public/release/models/isis/openconfig-isis.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/lacp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/lacp/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/lacp/openconfig-lacp.yang b/csbi/testdata/models/openconfig/public/release/models/lacp/openconfig-lacp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/lldp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/lldp/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp-types.yang b/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp.yang b/csbi/testdata/models/openconfig/public/release/models/lldp/openconfig-lldp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/local-routing/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/local-routing/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/local-routing/openconfig-local-routing.yang b/csbi/testdata/models/openconfig/public/release/models/local-routing/openconfig-local-routing.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/macsec/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/macsec/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec-types.yang b/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec.yang b/csbi/testdata/models/openconfig/public/release/models/macsec/openconfig-macsec.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/mpls/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-igp.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-igp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-ldp.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-ldp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-rsvp.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-rsvp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-sr.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-sr.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-static.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-static.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-te.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-te.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-types.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls.yang b/csbi/testdata/models/openconfig/public/release/models/mpls/openconfig-mpls.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/multicast/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp-types.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-igmp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim-types.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim.yang b/csbi/testdata/models/openconfig/public/release/models/multicast/openconfig-pim.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/network-instance/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l2.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l2.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l3.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-l3.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-policy.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-policy.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-types.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance.yang b/csbi/testdata/models/openconfig/public/release/models/network-instance/openconfig-network-instance.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/openconfig-extensions.yang b/csbi/testdata/models/openconfig/public/release/models/openconfig-extensions.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/openflow/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/openflow/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow-types.yang b/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow.yang b/csbi/testdata/models/openconfig/public/release/models/openflow/openconfig-openflow.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/optical-transport/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-channel-monitor.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-channel-monitor.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-amplifier.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-amplifier.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-attenuator.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-optical-attenuator.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-terminal-device.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-terminal-device.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-common.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-common.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-connectivity.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-connectivity.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-protection.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-line-protection.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-types.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-transport-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-wavelength-router.yang b/csbi/testdata/models/openconfig/public/release/models/optical-transport/openconfig-wavelength-router.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/ospf/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-policy.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-policy.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-types.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospf-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area-interface.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area-interface.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-area.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-common.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-common.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-global.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-global.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-lsdb.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2-lsdb.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2.yang b/csbi/testdata/models/openconfig/public/release/models/ospf/openconfig-ospfv2.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/p4rt/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/p4rt/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/p4rt/openconfig-p4rt.yang b/csbi/testdata/models/openconfig/public/release/models/p4rt/openconfig-p4rt.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/platform/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-cpu.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-cpu.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-ext.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-ext.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-fan.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-fan.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-linecard.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-linecard.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-pipeline-counters.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-pipeline-counters.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-port.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-port.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-psu.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-psu.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-software.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-software.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-transceiver.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-transceiver.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-types.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform.yang b/csbi/testdata/models/openconfig/public/release/models/platform/openconfig-platform.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-forwarding-policies.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-forwarding-policies.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-interfaces.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-path-groups.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-path-groups.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-srte.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-pf-srte.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-policy-forwarding.yang b/csbi/testdata/models/openconfig/public/release/models/policy-forwarding/openconfig-policy-forwarding.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/policy/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-policy-types.yang b/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-policy-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-routing-policy.yang b/csbi/testdata/models/openconfig/public/release/models/policy/openconfig-routing-policy.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/probes/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/probes/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes-types.yang b/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes.yang b/csbi/testdata/models/openconfig/public/release/models/probes/openconfig-probes.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/qos/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-elements.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-elements.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-interfaces.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-types.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos.yang b/csbi/testdata/models/openconfig/public/release/models/qos/openconfig-qos.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/relay-agent/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/relay-agent/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/relay-agent/openconfig-relay-agent.yang b/csbi/testdata/models/openconfig/public/release/models/relay-agent/openconfig-relay-agent.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/rib/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-attributes.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-attributes.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-ext.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-ext.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-shared-attributes.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-shared-attributes.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-table-attributes.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-table-attributes.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-tables.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-tables.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-types.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp.yang b/csbi/testdata/models/openconfig/public/release/models/rib/openconfig-rib-bgp.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/sampling/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/sampling/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/sampling/openconfig-sampling-sflow.yang b/csbi/testdata/models/openconfig/public/release/models/sampling/openconfig-sampling-sflow.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/segment-routing/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-rsvp-sr-ext.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-rsvp-sr-ext.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing-types.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-segment-routing.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-srte-policy.yang b/csbi/testdata/models/openconfig/public/release/models/segment-routing/openconfig-srte-policy.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/stp/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/stp/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree-types.yang b/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree.yang b/csbi/testdata/models/openconfig/public/release/models/stp/openconfig-spanning-tree.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/system/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-radius.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-radius.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-tacacs.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-tacacs.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-types.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-aaa.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarm-types.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarm-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarms.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-alarms.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-license.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-license.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-messages.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-messages.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-procmon.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-procmon.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-logging.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-logging.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-management.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-management.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-terminal.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system-terminal.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system.yang b/csbi/testdata/models/openconfig/public/release/models/system/openconfig-system.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/telemetry/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/telemetry/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry-types.yang b/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry.yang b/csbi/testdata/models/openconfig/public/release/models/telemetry/openconfig-telemetry.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/types/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/openconfig-inet-types.yang b/csbi/testdata/models/openconfig/public/release/models/types/openconfig-inet-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/openconfig-types.yang b/csbi/testdata/models/openconfig/public/release/models/types/openconfig-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/types/openconfig-yang-types.yang b/csbi/testdata/models/openconfig/public/release/models/types/openconfig-yang-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/vlan/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/vlan/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan-types.yang b/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan.yang b/csbi/testdata/models/openconfig/public/release/models/vlan/openconfig-vlan.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/.spec.yml b/csbi/testdata/models/openconfig/public/release/models/wifi/.spec.yml old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/README.md b/csbi/testdata/models/openconfig/public/release/models/wifi/README.md old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-access-points.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-access-points.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-interfaces.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-interfaces.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-manager.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-ap-manager.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-mac.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-mac.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-phy.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-phy.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-types.yang b/csbi/testdata/models/openconfig/public/release/models/wifi/openconfig-wifi-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/acl/arista-acl-deviations.yang b/csbi/testdata/models/release/openconfig/models/acl/arista-acl-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/aft/arista-aft-augments.yang b/csbi/testdata/models/release/openconfig/models/aft/arista-aft-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-augments.yang b/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-deviations.yang b/csbi/testdata/models/release/openconfig/models/bfd/arista-bfd-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-augments.yang b/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-deviations.yang b/csbi/testdata/models/release/openconfig/models/bgp/arista-bgp-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-augments.yang b/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-deviations.yang b/csbi/testdata/models/release/openconfig/models/interfaces/arista-intf-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/isis/arista-isis-augments.yang b/csbi/testdata/models/release/openconfig/models/isis/arista-isis-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/isis/arista-isis-deviations.yang b/csbi/testdata/models/release/openconfig/models/isis/arista-isis-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-augments.yang b/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-deviations.yang b/csbi/testdata/models/release/openconfig/models/lacp/arista-lacp-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-augments.yang b/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-deviations.yang b/csbi/testdata/models/release/openconfig/models/lldp/arista-lldp-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/local-routing/arista-local-routing-deviations.yang b/csbi/testdata/models/release/openconfig/models/local-routing/arista-local-routing-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-augments.yang b/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-deviations.yang b/csbi/testdata/models/release/openconfig/models/mpls/arista-mpls-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/multicast/arista-pim-augments.yang b/csbi/testdata/models/release/openconfig/models/multicast/arista-pim-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/network-instance/arista-netinst-deviations.yang b/csbi/testdata/models/release/openconfig/models/network-instance/arista-netinst-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-augments.yang b/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-deviations.yang b/csbi/testdata/models/release/openconfig/models/network-instance/arista-vlan-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-acl-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-acl-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-bfd-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-bfd-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-bgp-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-bgp-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-interfaces-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-interfaces-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-lacp-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-lacp-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-lldp-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-lldp-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-local-routing-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-local-routing-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-messages-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-messages-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-network-instance-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-network-instance-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-platform-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-platform-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-qos-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-qos-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-routing-policy-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-routing-policy-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/not-supported/arista-system-notsupported-deviations.yang b/csbi/testdata/models/release/openconfig/models/not-supported/arista-system-notsupported-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/openflow/arista-openflow-deviations.yang b/csbi/testdata/models/release/openconfig/models/openflow/arista-openflow-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-augments.yang b/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-deviations.yang b/csbi/testdata/models/release/openconfig/models/policy-forwarding/arista-srte-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-augments.yang b/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-deviations.yang b/csbi/testdata/models/release/openconfig/models/policy/arista-rpol-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/qos/arista-qos-augments.yang b/csbi/testdata/models/release/openconfig/models/qos/arista-qos-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/relay-agent/arista-relay-agent-deviations.yang b/csbi/testdata/models/release/openconfig/models/relay-agent/arista-relay-agent-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/system/arista-system-augments.yang b/csbi/testdata/models/release/openconfig/models/system/arista-system-augments.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/release/openconfig/models/system/arista-system-deviations.yang b/csbi/testdata/models/release/openconfig/models/system/arista-system-deviations.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/third_party/README.md b/csbi/testdata/models/third_party/README.md old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/third_party/ietf/iana-if-type.yang b/csbi/testdata/models/third_party/ietf/iana-if-type.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/third_party/ietf/ietf-inet-types.yang b/csbi/testdata/models/third_party/ietf/ietf-inet-types.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/third_party/ietf/ietf-interfaces.yang b/csbi/testdata/models/third_party/ietf/ietf-interfaces.yang old mode 100755 new mode 100644 diff --git a/csbi/testdata/models/third_party/ietf/ietf-yang-types.yang b/csbi/testdata/models/third_party/ietf/ietf-yang-types.yang old mode 100755 new mode 100644 diff --git a/csbi/write.go b/csbi/write.go old mode 100755 new mode 100644 diff --git a/csbi/write_test.go b/csbi/write_test.go old mode 100755 new mode 100644 diff --git a/dev_env_data/clab/basic_one_arista.yaml b/dev_env_data/clab/basic_one_arista.yaml old mode 100755 new mode 100644 diff --git a/dev_env_data/clab/basic_two_aristas.yaml b/dev_env_data/clab/basic_two_aristas.yaml old mode 100755 new mode 100644 diff --git a/dev_env_data/clab/basic_two_gnmi_targets.yaml b/dev_env_data/clab/basic_two_gnmi_targets.yaml old mode 100755 new mode 100644 diff --git a/dev_env_data/clab/demo.clab.yaml b/dev_env_data/clab/demo.clab.yaml old mode 100755 new mode 100644 diff --git a/dev_env_data/clab/gosdn.clab.yaml b/dev_env_data/clab/gosdn.clab.yaml old mode 100755 new mode 100644 diff --git a/dev_env_data/clab/gosdn_slim.clab.yaml b/dev_env_data/clab/gosdn_slim.clab.yaml old mode 100755 new mode 100644 diff --git a/dev_env_data/docker-compose/basic_docker-compose.yml b/dev_env_data/docker-compose/basic_docker-compose.yml old mode 100755 new mode 100644 diff --git a/dev_env_data/docker-compose/integration-test_docker-compose.yml b/dev_env_data/docker-compose/integration-test_docker-compose.yml old mode 100755 new mode 100644 diff --git a/dev_env_data/plugin-registry/plugin-store.json b/dev_env_data/plugin-registry/plugin-store.json old mode 100755 new mode 100644 diff --git a/dev_env_data/sdn/basic_two_aristas.json b/dev_env_data/sdn/basic_two_aristas.json old mode 100755 new mode 100644 diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 diff --git a/docker_volume_backup/.gitkeep b/docker_volume_backup/.gitkeep old mode 100755 new mode 100644 diff --git a/docs/images/logo.png b/docs/images/logo.png old mode 100755 new mode 100644 diff --git a/docs/images/logo.svg b/docs/images/logo.svg old mode 100755 new mode 100644 diff --git a/docs/index.md b/docs/index.md old mode 100755 new mode 100644 diff --git a/documentation/README.md b/documentation/README.md old mode 100755 new mode 100644 diff --git a/documentation/SUMMARY.md b/documentation/SUMMARY.md old mode 100755 new mode 100644 diff --git a/documentation/figures/.gitkeep b/documentation/figures/.gitkeep old mode 100755 new mode 100644 diff --git a/documentation/figures/nucleus/.gitkeep b/documentation/figures/nucleus/.gitkeep old mode 100755 new mode 100644 diff --git a/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio b/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio old mode 100755 new mode 100644 diff --git a/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio.png b/documentation/figures/nucleus/updated_controller_architecture_nucleus.drawio.png old mode 100755 new mode 100644 diff --git a/documentation/figures/overview/.gitkeep b/documentation/figures/overview/.gitkeep old mode 100755 new mode 100644 diff --git a/documentation/figures/overview/updated_controller_architecture_overview.drawio b/documentation/figures/overview/updated_controller_architecture_overview.drawio old mode 100755 new mode 100644 diff --git a/documentation/figures/overview/updated_controller_architecture_overview.drawio.png b/documentation/figures/overview/updated_controller_architecture_overview.drawio.png old mode 100755 new mode 100644 diff --git a/documentation/figures/plugins/.gitkeep b/documentation/figures/plugins/.gitkeep old mode 100755 new mode 100644 diff --git a/documentation/figures/plugins/plugin-device-interaction.drawio b/documentation/figures/plugins/plugin-device-interaction.drawio old mode 100755 new mode 100644 diff --git a/documentation/figures/plugins/plugin-device-interaction.drawio.png b/documentation/figures/plugins/plugin-device-interaction.drawio.png old mode 100755 new mode 100644 diff --git a/forks/LICENSE b/forks/LICENSE old mode 100755 new mode 100644 diff --git a/forks/README.md b/forks/README.md old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/arbitration.go b/forks/goarista/gnmi/arbitration.go old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/arbitration_test.go b/forks/goarista/gnmi/arbitration_test.go old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/client.go b/forks/goarista/gnmi/client.go old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/json.go b/forks/goarista/gnmi/json.go old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/operation.go b/forks/goarista/gnmi/operation.go old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/operation_test.go b/forks/goarista/gnmi/operation_test.go old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/path.go b/forks/goarista/gnmi/path.go old mode 100755 new mode 100644 diff --git a/forks/goarista/gnmi/path_test.go b/forks/goarista/gnmi/path_test.go old mode 100755 new mode 100644 diff --git a/forks/google/README.md b/forks/google/README.md old mode 100755 new mode 100644 diff --git a/forks/google/gnmi/model.go b/forks/google/gnmi/model.go old mode 100755 new mode 100644 diff --git a/forks/google/gnmi/modeldata/gostruct/gen.go b/forks/google/gnmi/modeldata/gostruct/gen.go old mode 100755 new mode 100644 diff --git a/forks/google/gnmi/modeldata/gostruct/generated.go.wasd b/forks/google/gnmi/modeldata/gostruct/generated.go.wasd old mode 100755 new mode 100644 diff --git a/forks/google/gnmi/modeldata/modeldata.go b/forks/google/gnmi/modeldata/modeldata.go old mode 100755 new mode 100644 diff --git a/forks/google/gnmi/server.go b/forks/google/gnmi/server.go old mode 100755 new mode 100644 diff --git a/forks/google/gnmi/server_test.go.wasd b/forks/google/gnmi/server_test.go.wasd old mode 100755 new mode 100644 diff --git a/forks/google/gnmi/util.go b/forks/google/gnmi/util.go old mode 100755 new mode 100644 diff --git a/go.mod b/go.mod old mode 100755 new mode 100644 diff --git a/go.sum b/go.sum old mode 100755 new mode 100644 diff --git a/gosdn-cli-showcase.webm b/gosdn-cli-showcase.webm old mode 100755 new mode 100644 diff --git a/integration-tests/application_tests/appUtility_test.go b/integration-tests/application_tests/appUtility_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/application_tests/application_test.go b/integration-tests/application_tests/application_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/application_tests/eventAssertion_test.go b/integration-tests/application_tests/eventAssertion_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/example_tests/example_test.go b/integration-tests/example_tests/example_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/integrationTestUtils/integrationTestUtils.go b/integration-tests/integrationTestUtils/integrationTestUtils.go old mode 100755 new mode 100644 diff --git a/integration-tests/lab_tests/lab00_test.go b/integration-tests/lab_tests/lab00_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/lab_tests/labUtility_test.go b/integration-tests/lab_tests/labUtility_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/networkElement_tests/modelUtility_test.go b/integration-tests/networkElement_tests/modelUtility_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/networkElement_tests/networkElement_test.go b/integration-tests/networkElement_tests/networkElement_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/rbac_tests/rbac_test.go b/integration-tests/rbac_tests/rbac_test.go old mode 100755 new mode 100644 diff --git a/integration-tests/topology_tests/topology_test.go b/integration-tests/topology_tests/topology_test.go old mode 100755 new mode 100644 diff --git a/lab-vm/README.md b/lab-vm/README.md old mode 100755 new mode 100644 diff --git a/lab-vm/vm-with-packer/gosdn_vm.pkr.hcl b/lab-vm/vm-with-packer/gosdn_vm.pkr.hcl old mode 100755 new mode 100644 diff --git a/lab-vm/vm-with-packer/http/meta-data b/lab-vm/vm-with-packer/http/meta-data old mode 100755 new mode 100644 diff --git a/lab-vm/vm-with-packer/http/user-data b/lab-vm/vm-with-packer/http/user-data old mode 100755 new mode 100644 diff --git a/lab-vm/vm-with-packer/scripts/gosdn_clone.sh b/lab-vm/vm-with-packer/scripts/gosdn_clone.sh old mode 100755 new mode 100644 diff --git a/lab-vm/vm-with-packer/scripts/setup.sh b/lab-vm/vm-with-packer/scripts/setup.sh old mode 100755 new mode 100644 diff --git a/lab-vm/vm-with-vagrant/Vagrantfile b/lab-vm/vm-with-vagrant/Vagrantfile old mode 100755 new mode 100644 diff --git a/makefiles/build/Makefile b/makefiles/build/Makefile old mode 100755 new mode 100644 diff --git a/makefiles/ci/Makefile b/makefiles/ci/Makefile old mode 100755 new mode 100644 diff --git a/makefiles/clab/Makefile b/makefiles/clab/Makefile old mode 100755 new mode 100644 diff --git a/makefiles/container/Makefile b/makefiles/container/Makefile old mode 100755 new mode 100644 diff --git a/makefiles/generate/Makefile b/makefiles/generate/Makefile old mode 100755 new mode 100644 diff --git a/mkdocs.yml b/mkdocs.yml old mode 100755 new mode 100644 diff --git a/models/generated/README.md b/models/generated/README.md old mode 100755 new mode 100644 diff --git a/models/generated/arista/additions.patch b/models/generated/arista/additions.patch old mode 100755 new mode 100644 diff --git a/models/generated/arista/arista.go b/models/generated/arista/arista.go old mode 100755 new mode 100644 diff --git a/models/generated/arista/config.yaml b/models/generated/arista/config.yaml old mode 100755 new mode 100644 diff --git a/models/generated/arista/yang.go b/models/generated/arista/yang.go old mode 100755 new mode 100644 diff --git a/models/generated/openconfig/additions.patch b/models/generated/openconfig/additions.patch old mode 100755 new mode 100644 diff --git a/models/generated/openconfig/config.yaml b/models/generated/openconfig/config.yaml old mode 100755 new mode 100644 diff --git a/models/generated/openconfig/openconfig.go b/models/generated/openconfig/openconfig.go old mode 100755 new mode 100644 diff --git a/models/generated/openconfig/yang.go b/models/generated/openconfig/yang.go old mode 100755 new mode 100644 diff --git a/plugin-registry/README.md b/plugin-registry/README.md old mode 100755 new mode 100644 diff --git a/plugin-registry/main.go b/plugin-registry/main.go old mode 100755 new mode 100644 diff --git a/plugin-registry/plugin-registry.Dockerfile b/plugin-registry/plugin-registry.Dockerfile old mode 100755 new mode 100644 diff --git a/plugin-registry/plugin-registry.Dockerfile.dockerignore b/plugin-registry/plugin-registry.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/plugin-registry/plugin-registry.debug.Dockerfile b/plugin-registry/plugin-registry.debug.Dockerfile old mode 100755 new mode 100644 diff --git a/plugin-registry/plugin-registry.debug.Dockerfile.dockerignore b/plugin-registry/plugin-registry.debug.Dockerfile.dockerignore old mode 100755 new mode 100644 diff --git a/plugin-registry/registry.go b/plugin-registry/registry.go old mode 100755 new mode 100644 diff --git a/plugin-registry/server.go b/plugin-registry/server.go old mode 100755 new mode 100644 diff --git a/plugin-registry/store.go b/plugin-registry/store.go old mode 100755 new mode 100644 diff --git a/plugins/README.md b/plugins/README.md old mode 100755 new mode 100644 diff --git a/plugins/examples/arista/cmd/main.go b/plugins/examples/arista/cmd/main.go old mode 100755 new mode 100644 diff --git a/plugins/examples/arista/plugin.yaml b/plugins/examples/arista/plugin.yaml old mode 100755 new mode 100644 diff --git a/plugins/examples/openconfig/cmd/main.go b/plugins/examples/openconfig/cmd/main.go old mode 100755 new mode 100644 diff --git a/plugins/examples/openconfig/plugin.yaml b/plugins/examples/openconfig/plugin.yaml old mode 100755 new mode 100644 diff --git a/plugins/sdk/deviceModel.go b/plugins/sdk/deviceModel.go old mode 100755 new mode 100644 diff --git a/react-ui/src/components/devices/view/device.view.tsx b/react-ui/src/components/devices/view/device.view.tsx index 1328781f5..3af506556 100755 --- a/react-ui/src/components/devices/view/device.view.tsx +++ b/react-ui/src/components/devices/view/device.view.tsx @@ -1,66 +1,58 @@ // device.view.tsx -import { - faCircleInfo, - faServer, - faSliders, -} from "@fortawesome/free-solid-svg-icons"; -import { useAppSelector } from "@hooks"; -import { GridLayout } from "@layout/grid.layout/grid.layout"; -import { GridBox } from "@shared/components/box/gridBox.view"; -import { JsonViewer } from "@shared/components/json_viewer/view/json_viewer.view"; -import { useRef } from "react"; -import { Col, Row } from "react-bootstrap"; -import { useTranslation } from "react-i18next"; -import { useDeviceViewModel } from "../view_model/device.viewmodel"; -import { DeviceList } from "./boxes/devices.box.view"; -import { DeviceListCollapsable } from "./boxes/information.box.view"; -import "./device.scss"; +import { faCircleInfo, faServer, faSliders } from '@fortawesome/free-solid-svg-icons' +import { useAppSelector } from '@hooks' +import { GridLayout } from '@layout/grid.layout/grid.layout' +import { GridBox } from '@shared/components/box/gridBox.view' +import { JsonViewer } from '@shared/components/json_viewer/view/json_viewer.view' +import { useRef } from 'react' +import { Col, Row } from 'react-bootstrap' +import { useTranslation } from 'react-i18next' +import { useDeviceViewModel } from '../view_model/device.viewmodel' +import { DeviceList } from './boxes/devices.box.view' +import { DeviceListCollapsable } from './boxes/information.box.view' +import './device.scss' const DeviceView = () => { - const { t } = useTranslation("common"); - const searchRef = useRef<HTMLInputElement>(null); - const { jsonYang } = useDeviceViewModel(); - const { selected } = useAppSelector((root) => root.device); + const { t } = useTranslation('common') + const searchRef = useRef<HTMLInputElement>(null) + const { jsonYang } = useDeviceViewModel() + const { selected } = useAppSelector(root => root.device) - return ( - <GridLayout> - <> - <div key="device-list"> - <GridBox title={t("device.box.list.title")} title_icon={faServer}> - <DeviceList searchRef={searchRef} /> - </GridBox> - </div> + return ( + <GridLayout> + <> + <div key="device-list"> + <GridBox title={t('device.box.list.title')} title_icon={faServer}> + <DeviceList searchRef={searchRef} /> + </GridBox> + </div> - <div key="device-metadata"> - <GridBox - title={t("device.box.information.title")} - title_icon={faCircleInfo} - disabled={!selected?.device} - > - <Row> - <Col xs={12}> - <DeviceListCollapsable - search={searchRef.current?.value || ""} - /> - </Col> - </Row> - </GridBox> - </div> + <div key="device-metadata"> + <GridBox + title={t('device.box.information.title')} + title_icon={faCircleInfo} + disabled={!selected?.device}> + <Row> + <Col xs={12}> + <DeviceListCollapsable search={searchRef.current?.value || ''} /> + </Col> + </Row> + </GridBox> + </div> - <div key="device-details"> - <GridBox - title={t("device.box.configuration.title")} - title_icon={faSliders} - disabled={!selected?.device} - > - <Row> - <Col xs={12}>{jsonYang && <JsonViewer json={jsonYang} />}</Col> - </Row> - </GridBox> - </div> - </> - </GridLayout> - ); -}; + <div key="device-details"> + <GridBox + title={t('device.box.configuration.title')} + title_icon={faSliders} + disabled={!selected?.device}> + <Row> + <Col xs={12}>{jsonYang && <JsonViewer json={jsonYang} />}</Col> + </Row> + </GridBox> + </div> + </> + </GridLayout> + ) +} -export default DeviceView; +export default DeviceView diff --git a/react-ui/src/components/devices/view_model/information.box.viewmodel.ts b/react-ui/src/components/devices/view_model/information.box.viewmodel.ts index 546e72086..a328ca1fa 100755 --- a/react-ui/src/components/devices/view_model/information.box.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/information.box.viewmodel.ts @@ -7,7 +7,11 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "react-toastify"; +<<<<<<< HEAD:react-ui/src/components/devices/view_model/information.box.viewmodel.ts export const useInformationViewModel = (searchRef, listRef) => { +======= +export const useDeviceTableViewModel = (searchRef, tableRef) => { +>>>>>>> parent of 9ea90588 (Merge branch 'master' into ui-implement-metadata-screen):react-ui/src/components/devices/view_model/device.table.viewmodel.ts const [searchTerm, setSearchTerm] = useState(''); const dispatch = useAppDispatch(); const { subscribe } = useMenu(); @@ -16,8 +20,8 @@ export const useInformationViewModel = (searchRef, listRef) => { const registerMenuOptions = () => { - const subscription = subscribe!({ - target: listRef.current, + const subscription = subscribe({ + target: tableRef.current, actions: [ { key: t('device.table.actions.copy'), @@ -61,8 +65,9 @@ export const useInformationViewModel = (searchRef, listRef) => { } } + // seperate use effect to rerun this after tableref and subscribe are initialized useEffect(() => { - if (!subscribe || !listRef?.current) { + if (!subscribe || !tableRef.current) { return } @@ -71,11 +76,11 @@ export const useInformationViewModel = (searchRef, listRef) => { return () => { unsubscribe() } - }, [listRef, subscribe]) + }, [tableRef, subscribe]) useEffect(() => { - if (!searchRef?.current) { + if (!searchRef.current) { return } @@ -92,13 +97,13 @@ export const useInformationViewModel = (searchRef, listRef) => { }; }, [searchRef]); - const dispatchDevice = (device: Device) => { + const trClickHandler = (device: Device) => { dispatch(setSelectedDevice({ device })); } return { searchTerm, - dispatchDevice + trClickHandler } } \ No newline at end of file diff --git a/react-ui/src/index.tsx b/react-ui/src/index.tsx index 7d6cfe0ac..2969f405f 100755 --- a/react-ui/src/index.tsx +++ b/react-ui/src/index.tsx @@ -15,6 +15,7 @@ import { PersistGate } from 'redux-persist/integration/react' import './i18n/config' import './index.scss' import { router } from './routes' +import './shared/icons/icons' import { persistor, store } from './stores' window.env = window.location.hostname === 'localhost' ? 'development' : 'production'; diff --git a/react-ui/src/shared/api/api.ts b/react-ui/src/shared/api/api.ts index e0f35f0b7..c223fa2cf 100755 --- a/react-ui/src/shared/api/api.ts +++ b/react-ui/src/shared/api/api.ts @@ -17,12 +17,12 @@ const injectedRtkApi = api addTagTypes, }) .injectEndpoints({ - endpoints: (build) => ({ + endpoints: build => ({ appServiceDeregister: build.mutation< AppServiceDeregisterApiResponse, AppServiceDeregisterApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/deregister`, method: 'POST', body: queryArg.appAppDeregisterRequest, @@ -33,7 +33,7 @@ const injectedRtkApi = api ConfigurationManagementServiceExportSdnConfigApiResponse, ConfigurationManagementServiceExportSdnConfigApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/export/${queryArg.pid}`, params: { timestamp: queryArg.timestamp, @@ -45,7 +45,7 @@ const injectedRtkApi = api ConfigurationManagementServiceImportSdnConfigApiResponse, ConfigurationManagementServiceImportSdnConfigApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/import/${queryArg.pid}`, method: 'POST', params: { @@ -55,11 +55,8 @@ const injectedRtkApi = api }), invalidatesTags: ['ConfigurationManagementService'], }), - authServiceLogin: build.mutation< - AuthServiceLoginApiResponse, - AuthServiceLoginApiArg - >({ - query: (queryArg) => ({ + authServiceLogin: build.mutation<AuthServiceLoginApiResponse, AuthServiceLoginApiArg>({ + query: queryArg => ({ url: `/login`, method: 'POST', body: queryArg.rbacLoginRequest, @@ -70,7 +67,7 @@ const injectedRtkApi = api AuthServiceLogoutApiResponse, AuthServiceLogoutApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/logout/${queryArg.username}`, method: 'POST', params: { @@ -83,7 +80,7 @@ const injectedRtkApi = api NetworkElementServiceGetAllFlattenedApiResponse, NetworkElementServiceGetAllFlattenedApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes`, params: { timestamp: queryArg.timestamp, @@ -96,7 +93,7 @@ const injectedRtkApi = api NetworkElementServiceAddListApiResponse, NetworkElementServiceAddListApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes`, method: 'POST', body: queryArg.networkelementAddListRequest, @@ -107,7 +104,7 @@ const injectedRtkApi = api NetworkElementServiceGetChangeListApiResponse, NetworkElementServiceGetChangeListApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/changes`, params: { timestamp: queryArg.timestamp, @@ -120,7 +117,7 @@ const injectedRtkApi = api NetworkElementServiceSetChangeListApiResponse, NetworkElementServiceSetChangeListApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/changes`, method: 'POST', body: queryArg.networkelementSetChangeListRequest, @@ -131,7 +128,7 @@ const injectedRtkApi = api NetworkElementServiceGetChangeApiResponse, NetworkElementServiceGetChangeApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/changes/${queryArg.cuid}`, params: { timestamp: queryArg.timestamp, @@ -144,7 +141,7 @@ const injectedRtkApi = api NetworkElementServiceSetPathListApiResponse, NetworkElementServiceSetPathListApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/paths`, method: 'POST', body: queryArg.networkelementSetPathListRequest, @@ -155,7 +152,7 @@ const injectedRtkApi = api NetworkElementServiceGetApiResponse, NetworkElementServiceGetApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/${queryArg.mneid}`, params: { timestamp: queryArg.timestamp, @@ -168,7 +165,7 @@ const injectedRtkApi = api NetworkElementServiceDeleteApiResponse, NetworkElementServiceDeleteApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/${queryArg.mneid}`, method: 'DELETE', params: { @@ -182,7 +179,7 @@ const injectedRtkApi = api NetworkElementServiceGetIntendedPathApiResponse, NetworkElementServiceGetIntendedPathApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/${queryArg.mneid}/intendedpaths/${queryArg.intendedPath}`, params: { timestamp: queryArg.timestamp, @@ -195,7 +192,7 @@ const injectedRtkApi = api NetworkElementServiceGetPathApiResponse, NetworkElementServiceGetPathApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/mnes/${queryArg.mneid}/paths/${queryArg.path}`, params: { timestamp: queryArg.timestamp, @@ -208,7 +205,7 @@ const injectedRtkApi = api NetworkElementServiceUpdateApiResponse, NetworkElementServiceUpdateApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/network-element/update`, method: 'POST', body: queryArg.networkelementUpdateNetworkElementRequest, @@ -219,7 +216,7 @@ const injectedRtkApi = api PluginInternalServiceGetAvailablePluginsApiResponse, PluginInternalServiceGetAvailablePluginsApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/plugins`, params: { timestamp: queryArg.timestamp, @@ -227,11 +224,8 @@ const injectedRtkApi = api }), providesTags: ['PluginInternalService'], }), - pndServiceGetPnd: build.query< - PndServiceGetPndApiResponse, - PndServiceGetPndApiArg - >({ - query: (queryArg) => ({ + pndServiceGetPnd: build.query<PndServiceGetPndApiResponse, PndServiceGetPndApiArg>({ + query: queryArg => ({ url: `/pnd/${queryArg.pid}`, params: { timestamp: queryArg.timestamp, @@ -243,7 +237,7 @@ const injectedRtkApi = api PndServiceGetPndListApiResponse, PndServiceGetPndListApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/pnds`, params: { timestamp: queryArg.timestamp, @@ -255,7 +249,7 @@ const injectedRtkApi = api PndServiceCreatePndListApiResponse, PndServiceCreatePndListApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/pnds`, method: 'POST', body: queryArg.pndCreatePndListRequest, @@ -266,7 +260,7 @@ const injectedRtkApi = api PndServiceDeletePndApiResponse, PndServiceDeletePndApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/pnds/${queryArg.pid}`, method: 'DELETE', params: { @@ -279,7 +273,7 @@ const injectedRtkApi = api AppServiceRegisterApiResponse, AppServiceRegisterApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/register`, method: 'POST', body: queryArg.appAppRegisterRequest, @@ -290,7 +284,7 @@ const injectedRtkApi = api RoleServiceGetRolesApiResponse, RoleServiceGetRolesApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/roles`, params: { timestamp: queryArg.timestamp, @@ -302,7 +296,7 @@ const injectedRtkApi = api RoleServiceCreateRolesApiResponse, RoleServiceCreateRolesApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/roles/create`, method: 'POST', body: queryArg.rbacCreateRolesRequest, @@ -313,7 +307,7 @@ const injectedRtkApi = api RoleServiceDeleteRolesApiResponse, RoleServiceDeleteRolesApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/roles/delete`, method: 'DELETE', params: { @@ -327,7 +321,7 @@ const injectedRtkApi = api RoleServiceDeletePermissionsForRoleApiResponse, RoleServiceDeletePermissionsForRoleApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/roles/delete/permissions`, method: 'DELETE', params: { @@ -342,7 +336,7 @@ const injectedRtkApi = api RoleServiceGetRoleApiResponse, RoleServiceGetRoleApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/roles/get`, params: { timestamp: queryArg.timestamp, @@ -356,7 +350,7 @@ const injectedRtkApi = api RoleServiceUpdateRolesApiResponse, RoleServiceUpdateRolesApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/roles/update`, method: 'POST', body: queryArg.rbacUpdateRolesRequest, @@ -367,7 +361,7 @@ const injectedRtkApi = api RoutingTableServiceGetRoutesApiResponse, RoutingTableServiceGetRoutesApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/routing`, params: { timestamp: queryArg.timestamp, @@ -379,7 +373,7 @@ const injectedRtkApi = api RoutingTableServiceAddRoutingTableApiResponse, RoutingTableServiceAddRoutingTableApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/routing/create`, method: 'POST', body: queryArg.topologyAddRoutingTableRequest, @@ -390,7 +384,7 @@ const injectedRtkApi = api RoutingTableServiceDeleteRouteApiResponse, RoutingTableServiceDeleteRouteApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/routing/delete`, method: 'DELETE', params: { @@ -404,7 +398,7 @@ const injectedRtkApi = api SubscriptionManagementServiceResetAllSubscriptionsApiResponse, SubscriptionManagementServiceResetAllSubscriptionsApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/submanagement/reset`, params: { timestamp: queryArg.timestamp, @@ -416,7 +410,7 @@ const injectedRtkApi = api SubscriptionManagementServiceGetAllApiResponse, SubscriptionManagementServiceGetAllApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/submanagement/subscriptions`, params: { timestamp: queryArg.timestamp, @@ -428,7 +422,7 @@ const injectedRtkApi = api SubscriptionManagementServiceAddApiResponse, SubscriptionManagementServiceAddApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/submanagement/${queryArg.mneid}`, method: 'POST', body: queryArg.subscriptionmanagementSubscriptionManagementServiceAddBody, @@ -439,7 +433,7 @@ const injectedRtkApi = api SubscriptionManagementServiceGetApiResponse, SubscriptionManagementServiceGetApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/submanagement/${queryArg.subid}`, params: { timestamp: queryArg.timestamp, @@ -451,7 +445,7 @@ const injectedRtkApi = api SubscriptionManagementServiceDeleteApiResponse, SubscriptionManagementServiceDeleteApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/submanagement/${queryArg.subid}`, method: 'DELETE', params: { @@ -464,7 +458,7 @@ const injectedRtkApi = api TopologyServiceGetTopologyApiResponse, TopologyServiceGetTopologyApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/topology`, params: { timestamp: queryArg.timestamp, @@ -476,7 +470,7 @@ const injectedRtkApi = api TopologyServiceAddLinkApiResponse, TopologyServiceAddLinkApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/topology/create`, method: 'POST', body: queryArg.topologyAddLinkRequest, @@ -487,7 +481,7 @@ const injectedRtkApi = api TopologyServiceDeleteLinkApiResponse, TopologyServiceDeleteLinkApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/topology/delete`, method: 'DELETE', params: { @@ -501,7 +495,7 @@ const injectedRtkApi = api TopologyServiceUpdateLinkApiResponse, TopologyServiceUpdateLinkApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/topology/update`, method: 'POST', body: queryArg.topologyUpdateLinkRequest, @@ -512,7 +506,7 @@ const injectedRtkApi = api UserServiceGetUsersApiResponse, UserServiceGetUsersApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/users`, params: { timestamp: queryArg.timestamp, @@ -524,7 +518,7 @@ const injectedRtkApi = api UserServiceCreateUsersApiResponse, UserServiceCreateUsersApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/users/create`, method: 'POST', body: queryArg.rbacCreateUsersRequest, @@ -535,7 +529,7 @@ const injectedRtkApi = api UserServiceDeleteUsersApiResponse, UserServiceDeleteUsersApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/users/delete`, method: 'DELETE', params: { @@ -549,7 +543,7 @@ const injectedRtkApi = api UserServiceGetUserApiResponse, UserServiceGetUserApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/users/get`, params: { timestamp: queryArg.timestamp, @@ -563,7 +557,7 @@ const injectedRtkApi = api UserServiceUpdateUsersApiResponse, UserServiceUpdateUsersApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/users/update`, method: 'POST', body: queryArg.rbacUpdateUsersRequest, @@ -574,7 +568,7 @@ const injectedRtkApi = api NetworkElementServiceParseYangApiResponse, NetworkElementServiceParseYangApiArg >({ - query: (queryArg) => ({ + query: queryArg => ({ url: `/yang/parse`, params: { timestamp: queryArg.timestamp, @@ -607,8 +601,7 @@ export type ConfigurationManagementServiceImportSdnConfigApiArg = { timestamp?: string sdnConfigData?: string } -export type AuthServiceLoginApiResponse = - /** status 200 A successful response. */ RbacLoginResponse +export type AuthServiceLoginApiResponse = /** status 200 A successful response. */ RbacLoginResponse export type AuthServiceLoginApiArg = { rbacLoginRequest: Login } @@ -698,8 +691,7 @@ export type PluginInternalServiceGetAvailablePluginsApiResponse = export type PluginInternalServiceGetAvailablePluginsApiArg = { timestamp?: string } -export type PndServiceGetPndApiResponse = - /** status 200 A successful response. */ PndGetPndResponse +export type PndServiceGetPndApiResponse = /** status 200 A successful response. */ PndGetPndResponse export type PndServiceGetPndApiArg = { pid: string /** Timestamp in nanoseconds since Epoch. */ @@ -968,11 +960,10 @@ export type TransportGnmiTransportOption = { } export type TransportRestconfTransportOption = object export type ChangedAccordingToStyleGuideHttpsDocsBufBuildBestPracticesStyleGuideEnums = - - | 'TYPE_UNSPECIFIED' - | 'TYPE_OPENCONFIG' - | 'TYPE_CONTAINERISED' - | 'TYPE_PLUGIN' + | 'TYPE_UNSPECIFIED' + | 'TYPE_OPENCONFIG' + | 'TYPE_CONTAINERISED' + | 'TYPE_PLUGIN' export type TransportTransportOption = { address?: string username?: string diff --git a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss index b971de526..832766470 100755 --- a/react-ui/src/shared/components/json_viewer/view/json_viewer.scss +++ b/react-ui/src/shared/components/json_viewer/view/json_viewer.scss @@ -1,11 +1,17 @@ @import "/src/shared/style/colors.scss"; +.list-group-tr { + list-style-type: none; + margin: 0; + padding: 0 0; +} + .list-item-td { & > td { color: lighten(map-get($map: $theme-colors, $key: "black"), 20%) !important; + background-color: white !important; border: 0; padding: 0.2em 0 !important; - background-color: transparent !important; } & > td:nth-child(2) { diff --git a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx index ccbeac713..1662058dc 100644 --- a/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx +++ b/react-ui/src/shared/components/json_viewer/viewmodel/json_viewer.viewmodel.tsx @@ -64,8 +64,12 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy } const registerMenuOptions = () => { - const subscription = subscribe!({ - target: container.current!, + if (!container.current) { + return () => { } + } + + const subscription = subscribe({ + target: container.current, actions: [ { key: t('json_viewer.copy'), @@ -132,18 +136,8 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy }, [searchTerm, json]) useEffect(() => { - if (!container.current || !subscribe) { - return - } - - const unsubscribe = registerMenuOptions() - - return () => { - unsubscribe() - } - }, [subscribe]) + const unsubscribe = registerMenuOptions(); - useEffect(() => { if (search.current) { search.current.addEventListener('input', handleSearchInput) } @@ -152,6 +146,7 @@ export const useJsonViewer = ({ json, search, container }: JsonViewerViewModelTy if (search.current) { search.current.removeEventListener('input', handleSearchInput) } + unsubscribe() } }, []) diff --git a/react-ui/src/shared/icons/icons.ts b/react-ui/src/shared/icons/icons.ts new file mode 100755 index 000000000..9c8791cc9 --- /dev/null +++ b/react-ui/src/shared/icons/icons.ts @@ -0,0 +1,4 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { faSpinner } from '@fortawesome/free-solid-svg-icons' + +library.add(faSpinner) \ No newline at end of file diff --git a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx index 7ec2c4a51..b2d36561a 100644 --- a/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx +++ b/react-ui/src/shared/layouts/grid.layout/grid.layout.tsx @@ -1,53 +1,53 @@ -import React, { ReactElement, useEffect, useRef, useState } from 'react'; -import RGL, { WidthProvider } from "react-grid-layout"; +import React, { ReactElement, useEffect, useRef, useState } from 'react' +import RGL, { WidthProvider } from 'react-grid-layout' -import 'react-grid-layout/css/styles.css'; -import 'react-resizable/css/styles.css'; -import './grid.layout.scss'; +import 'react-grid-layout/css/styles.css' +import 'react-resizable/css/styles.css' +import './grid.layout.scss' -const ResponsiveGridLayout = WidthProvider(RGL); +const ResponsiveGridLayout = WidthProvider(RGL) interface GridLayoutProps { - children: ReactElement; + children: ReactElement } -const RowCount = 2; -const padding = 80; +const RowCount = 2 +const padding = 80 export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { - const [rowHeight, setRowHeight] = useState<number>(0); - const [containerHeight, setContainerHeight] = useState<number>(0); - const [mounted, setMounted] = useState<boolean>(false); - const containerRef = useRef<HTMLDivElement>(null); + const [rowHeight, setRowHeight] = useState<number>(0) + const [containerHeight, setContainerHeight] = useState<number>(0) + const [mounted, setMounted] = useState<boolean>(false) + const containerRef = useRef<HTMLDivElement>(null) const layouts = [ { i: 'device-list', x: 0, y: 0, w: 2, h: 1, minW: 1, minH: 1 }, { i: 'device-metadata', x: 0, y: 1, w: 2, h: 1, minW: 1, minH: 1 }, - { i: 'device-details', x: 3, y: 0, w: 2, h: 2, minW: 1, minH: 1 } - ]; + { i: 'device-details', x: 3, y: 0, w: 2, h: 2, minW: 1, minH: 1 }, + ] const calcHeights = () => { - const container = containerRef.current; + const container = containerRef.current if (!container) { - const height = document.body.clientHeight * 0.7; - setRowHeight(Math.floor(height / RowCount)); - return; + const height = document.body.clientHeight * 0.7 + setRowHeight(Math.floor(height / RowCount)) + return } - const { top } = container.getBoundingClientRect(); - const height = document.body.clientHeight - (top + padding); - setContainerHeight(height); - setRowHeight(Math.floor(height / RowCount)); - }; + const { top } = container.getBoundingClientRect() + const height = document.body.clientHeight - (top + padding) + setContainerHeight(height) + setRowHeight(Math.floor(height / RowCount)) + } useEffect(() => { - calcHeights(); - }, [containerRef.current]); + calcHeights() + }, [containerRef.current]) useEffect(() => { - setMounted(true); - window.addEventListener('resize', calcHeights); - return () => window.removeEventListener('resize', calcHeights); - }, []); + setMounted(true) + window.addEventListener('resize', calcHeights) + return () => window.removeEventListener('resize', calcHeights) + }, []) return ( <div @@ -55,8 +55,7 @@ export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { style={{ display: mounted ? 'block' : 'none', height: `${containerHeight}px`, - }} - > + }}> <ResponsiveGridLayout cols={5} layout={layouts} @@ -72,10 +71,9 @@ export const GridLayout: React.FC<GridLayoutProps> = ({ children }) => { <div className="custom-resize-handle"> <div className="resize-handle-inner" /> </div> - } - > + }> {children.props.children} </ResponsiveGridLayout> </div> - ); -}; + ) +} diff --git a/react-ui/src/shared/style/box.scss b/react-ui/src/shared/style/box.scss new file mode 100755 index 000000000..53158f515 --- /dev/null +++ b/react-ui/src/shared/style/box.scss @@ -0,0 +1,59 @@ +@import "./colors.scss"; + +$box-padding: 10px; +$border-radius: 0.25em; +$border-width: 2px; +$transition-duration: 0.3s; + +.c-box { + padding: $box-padding; + background-color: white; + position: relative; + border-radius: $border-radius; + transition: box-shadow $transition-duration ease-in-out; + + background: + linear-gradient(white, white) padding-box, + linear-gradient( + 180deg, + rgba(map-get($theme-colors, "primary"), 0.4) 0%, + rgba(map-get($theme-colors, "primary"), 0.2) 40%, + rgba(map-get($theme-colors, "primary"), 0.1) 100% + ) + border-box; + border: $border-width solid transparent; + box-shadow: $box-shadow; + + &::before { + content: ""; + position: absolute; + top: -$border-width; + left: -$border-width; + right: -$border-width; + bottom: -$border-width; + background: linear-gradient( + 180deg, + rgba(map-get($theme-colors, "primary"), 0.4) 0%, + rgba(map-get($theme-colors, "primary"), 0.2) 60%, + rgba(map-get($theme-colors, "primary"), 0.1) 100% + ); + border-radius: inherit; + z-index: -1; + opacity: 0; + transition: opacity $transition-duration ease-in-out; + } + + &:hover { + box-shadow: 0 0.5rem 1rem rgba(map-get($theme-colors, "primary"), 0.2); + + &::before { + opacity: 1; + } + } +} + +.abstract-box { + padding: $box-padding; + font-size: 0.9em; + border-radius: calc($border-radius / 2); +} diff --git a/renovate.json b/renovate.json old mode 100755 new mode 100644 -- GitLab From ee3682fc176f4838643296a8f1bdf8535e968f79 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Mon, 24 Feb 2025 11:42:54 +0100 Subject: [PATCH 73/78] (ui): add documentation --- README.md | 7 +++ .../figures/react-ui/landing_page.png | Bin 0 -> 133946 bytes react-ui/README.md | 41 +++++++++++++++--- 3 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 documentation/figures/react-ui/landing_page.png diff --git a/README.md b/README.md index a418a5ab7..3699e7774 100644 --- a/README.md +++ b/README.md @@ -394,3 +394,10 @@ There exists a `example_tests` folder where examples of using the `integrationTe Run the integration tests with `make controller-integration-tests`. If you want to debug the tests, use `make controller-integration-tests-debug-up` to start the environment. You can now use the debugger to debug the test (but not the goSDN side). Stop the environment when you are done with `make controller-integration-tests-debug-down`. + +## Web UI +Despite the goSDN console the web ui provides a more convenient way to gather information. The web UI is also integrated in the containerlab so that it also accessible after executing `make containerlab-start`. The web ui is accessible at [localhost:8088](http://localhost:8088) +<img src="documentation/figures/react-ui/landing_page.png" /> +Currently the UI provides a easy way to ready properties of switches. You can also create new switches which is the equivalent command to `mne create` in the console. You find a more detailed docu [here](react-ui/README.md) + + diff --git a/documentation/figures/react-ui/landing_page.png b/documentation/figures/react-ui/landing_page.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b661c63bc96551282d3a34594c24e87b71fa6b GIT binary patch literal 133946 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 N^>p=fS?83{1OS<?3=aSR literal 0 HcmV?d00001 diff --git a/react-ui/README.md b/react-ui/README.md index b6c8b0ba1..3f765437b 100755 --- a/react-ui/README.md +++ b/react-ui/README.md @@ -1,11 +1,40 @@ # React - UI -This is the UI for the goSDN project. It's a webapp written in react +The web app is a more convenient way to gather information about the goSDN network. -### Getting started +<img src="../documentation/figures/react-ui/landing_page.png" /> +Login with your username and password. The default credentials can be found inside the logs of the goSDN docker container: `docker logs clab-gosdn_csbi_arista_base-gosdn` -### Requirements -- Docker +## Current Functionality +### Functional +* Read information about existing and new created switches +* Create new switches +### Technical +* Continuously fetching the current state from the backend +* Frontend persistence of configuration +### Essential +* Login / Logout +* Custom right click menu that provides functionalities depending on the clicked area -### Author -Matthias Feyll \ No newline at end of file +## Technical Description +### Tech Stack +* React 18 +* Bootstrap 5 +* Redux 5 +* RTK-Query 2 + +### Deployment +The web ui is integrated in the containerlab deployment. This uses the [Dockerfile](docker/webserver/Dockerfile) from `docker/webserver/Dockerfile`. It contains a two stage build. The first stage builds the deliverable HTML, CSS and Javascript. The second stage creates the actual webserver that provides the created web assets. The webserver is a nginx with default production ready configurations. + +### Development +During development you start the existing containerlab environment by executing +``` +make containerlab-slim-start-configured +``` +After that execute with yarn or npm +``` +yarn +yarn build::api # generates api code provided by the swagger json file from goSDN +yarn dev +``` +Your local dev environment is now accessible at [localhost:3000](http://localhost:3000). The dev server is running inside a docker container. The container is attached to the network that contains the rest goSDN containers. \ No newline at end of file -- GitLab From 3c982ef9ad6510011c55051625b13830de44eb5a Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 6 Mar 2025 11:32:39 +0100 Subject: [PATCH 74/78] remove explicit json parse --- .../devices/reducer/device.reducer.ts | 11 +------ .../devices/routines/mne.routine.ts | 32 ++----------------- .../devices/view_model/device.viewmodel.ts | 7 ++-- 3 files changed, 7 insertions(+), 43 deletions(-) diff --git a/react-ui/src/components/devices/reducer/device.reducer.ts b/react-ui/src/components/devices/reducer/device.reducer.ts index c7538079a..812c416f8 100755 --- a/react-ui/src/components/devices/reducer/device.reducer.ts +++ b/react-ui/src/components/devices/reducer/device.reducer.ts @@ -16,7 +16,6 @@ export type Device = NetworkelementFlattenedManagedNetworkElement interface SelectedObject { device: Device mne: NetworkelementManagedNetworkElement | null - json: JSON | null } export interface DeviceSliceState { @@ -93,18 +92,10 @@ const deviceSlice = createSlice({ state.selected.mne = action.payload }, - - setSelectedJson: (state, action: PayloadAction<JSON>) => { - if (!state.selected) { - throw new Error('Selected Device is null where it shouldn´t be null') - } - - state.selected.json = action.payload || null - }, }, }) -export const { setDevices, setSelectedDevice, setSelectedMne, setSelectedJson, setPnds } = +export const { setDevices, setSelectedDevice, setSelectedMne, setPnds } = deviceSlice.actions export default deviceSlice.reducer diff --git a/react-ui/src/components/devices/routines/mne.routine.ts b/react-ui/src/components/devices/routines/mne.routine.ts index 967da2615..8f75e3a64 100755 --- a/react-ui/src/components/devices/routines/mne.routine.ts +++ b/react-ui/src/components/devices/routines/mne.routine.ts @@ -1,9 +1,8 @@ -import { api, NetworkElementServiceGetApiArg, NetworkElementServiceParseYangApiArg } from '@api/api' +import { api, NetworkElementServiceGetApiArg } from '@api/api' import { Device, setSelectedDevice, - setSelectedJson, - setSelectedMne, + setSelectedMne } from '@component/devices/reducer/device.reducer' import { createAsyncThunk } from '@reduxjs/toolkit' import { addRoutine } from '@shared/reducer/routine.reducer' @@ -83,30 +82,3 @@ startListening({ listenerApi.dispatch(setSelectedMne(action.payload.mne)) }, }) - -/** - * #3 - * Fetch & receive json - * - * Triggered by #2 - */ -startListening({ - predicate: (action) => setSelectedMne.match(action), - effect: async (action, listenerApi) => { - const payload: NetworkElementServiceParseYangApiArg = { - timestamp: new Date().getTime().toString(), - yang: action.payload.model, - } - - const { data } = await listenerApi.dispatch( - api.endpoints.networkElementServiceParseYang.initiate(payload) - ) - - if (!data?.json) { - throw new Error('ParseYang response is invalid. The json field is null') - } - const json = JSON.parse(data.json) - - listenerApi.dispatch(setSelectedJson(json)) - }, -}) diff --git a/react-ui/src/components/devices/view_model/device.viewmodel.ts b/react-ui/src/components/devices/view_model/device.viewmodel.ts index 5c4acc661..543c45857 100755 --- a/react-ui/src/components/devices/view_model/device.viewmodel.ts +++ b/react-ui/src/components/devices/view_model/device.viewmodel.ts @@ -17,12 +17,13 @@ export const useDeviceViewModel = () => { } const getYangModelJSON = (): JSON | null => { - if (!selectedDevice?.json) { + if (!selectedDevice?.mne?.model) { return null } - const key = Object.keys(selectedDevice.json).at(1) as keyof typeof selectedDevice.json - const innerJson = selectedDevice.json[key] + const json = JSON.parse(selectedDevice.mne.model); + const key = Object.keys(json).at(1) as keyof typeof selectedDevice.mne.model + const innerJson = json[key] if (!(innerJson instanceof Object)) { return null -- GitLab From 3f0080310854173eb47af37c6f4830539e5303fd Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 6 Mar 2025 11:33:02 +0100 Subject: [PATCH 75/78] remove redundant plugin endpoint --- .../gnmi/proto/collector/collector.pb.go | 2 +- .../openconfig/gnmi/proto/gnmi/gnmi.pb.go | 2 +- .../gnmi/proto/gnmi_ext/gnmi_ext.pb.go | 2 +- .../openconfig/gnmi/proto/target/target.pb.go | 2 +- .../gnmi/testing/fake/proto/fake.pb.go | 2 +- api/go/gosdn/app/app.pb.go | 2 +- .../configurationmanagement.pb.go | 2 +- .../configurationmanagement.pb.gw.go | 2 + api/go/gosdn/conflict/conflict.pb.go | 2 +- api/go/gosdn/csbi/csbi.pb.go | 2 +- .../gosdn/networkelement/networkelement.pb.go | 2 +- .../networkelement/networkelement.pb.gw.go | 8 + .../plugin-internal/plugin-internal.pb.go | 139 +++++------------- .../plugin-internal/plugin-internal.pb.gw.go | 35 ++--- .../plugin-internal_grpc.pb.go | 42 +----- .../plugin-registry/plugin-registry.pb.go | 2 +- api/go/gosdn/plugin/plugin.pb.go | 2 +- api/go/gosdn/pnd/pnd.pb.go | 2 +- api/go/gosdn/pnd/pnd.pb.gw.go | 3 + api/go/gosdn/rbac/rbac.pb.go | 2 +- api/go/gosdn/rbac/rbac.pb.gw.go | 1 + api/go/gosdn/rbac/role.pb.go | 2 +- api/go/gosdn/rbac/role.pb.gw.go | 4 + api/go/gosdn/rbac/user.pb.go | 2 +- api/go/gosdn/rbac/user.pb.gw.go | 3 + api/go/gosdn/southbound/southbound.pb.go | 2 +- .../subscriptionmanagement.pb.go | 2 +- .../subscriptionmanagement.pb.gw.go | 4 + api/go/gosdn/topology/link.pb.go | 2 +- api/go/gosdn/topology/node.pb.go | 2 +- api/go/gosdn/topology/port.pb.go | 2 +- api/go/gosdn/topology/route.pb.go | 2 +- api/go/gosdn/topology/routingTable.pb.go | 2 +- api/go/gosdn/topology/routingTable.pb.gw.go | 2 + api/go/gosdn/topology/topology.pb.go | 2 +- api/go/gosdn/topology/topology.pb.gw.go | 2 + api/go/gosdn/transport/transport.pb.go | 2 +- api/openapiv2/gosdn_northbound.swagger.json | 2 +- .../plugin-internal/plugin-internal.proto | 12 +- controller/northbound/server/plugin.go | 15 -- 40 files changed, 112 insertions(+), 212 deletions(-) diff --git a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go index 3eba4d236..4374f3e6a 100644 --- a/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/collector/collector.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/collector/collector.proto diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go index 0d1e241b0..0d3b99995 100644 --- a/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/gnmi/gnmi.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/gnmi/gnmi.proto diff --git a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go index 5536b80f4..84ee798b7 100644 --- a/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/gnmi_ext/gnmi_ext.proto diff --git a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go index 607f004a9..f76d4b320 100644 --- a/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go +++ b/api/go/github.com/openconfig/gnmi/proto/target/target.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: github.com/openconfig/gnmi/proto/target/target.proto diff --git a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go index 18fcb6386..e2efcc837 100644 --- a/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go +++ b/api/go/github.com/openconfig/gnmi/testing/fake/proto/fake.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: github.com/openconfig/gnmi/testing/fake/proto/fake.proto diff --git a/api/go/gosdn/app/app.pb.go b/api/go/gosdn/app/app.pb.go index 2f69f65da..4d4910459 100644 --- a/api/go/gosdn/app/app.pb.go +++ b/api/go/gosdn/app/app.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/app/app.proto diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go index 1a8b68cab..257316482 100644 --- a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go +++ b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/configurationmanagement/configurationmanagement.proto diff --git a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go index 20532a162..5c5c9924c 100644 --- a/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go +++ b/api/go/gosdn/configurationmanagement/configurationmanagement.pb.gw.go @@ -43,6 +43,7 @@ func request_ConfigurationManagementService_ExportSDNConfig_0(ctx context.Contex metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") @@ -93,6 +94,7 @@ func request_ConfigurationManagementService_ImportSDNConfig_0(ctx context.Contex metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") diff --git a/api/go/gosdn/conflict/conflict.pb.go b/api/go/gosdn/conflict/conflict.pb.go index 89b844920..193bf7cb4 100644 --- a/api/go/gosdn/conflict/conflict.pb.go +++ b/api/go/gosdn/conflict/conflict.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/conflict/conflict.proto diff --git a/api/go/gosdn/csbi/csbi.pb.go b/api/go/gosdn/csbi/csbi.pb.go index 39d930645..6331c0957 100644 --- a/api/go/gosdn/csbi/csbi.pb.go +++ b/api/go/gosdn/csbi/csbi.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/csbi/csbi.proto diff --git a/api/go/gosdn/networkelement/networkelement.pb.go b/api/go/gosdn/networkelement/networkelement.pb.go index 17e66647e..9eb67529e 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.go +++ b/api/go/gosdn/networkelement/networkelement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/networkelement/networkelement.proto diff --git a/api/go/gosdn/networkelement/networkelement.pb.gw.go b/api/go/gosdn/networkelement/networkelement.pb.gw.go index 409a3a5a4..1671997bf 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.gw.go +++ b/api/go/gosdn/networkelement/networkelement.pb.gw.go @@ -66,6 +66,7 @@ func request_NetworkElementService_GetAllFlattened_0(ctx context.Context, marsha protoReq GetAllFlattenedRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -99,6 +100,7 @@ func request_NetworkElementService_Get_0(ctx context.Context, marshaler runtime. metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") @@ -148,6 +150,7 @@ func request_NetworkElementService_ParseYang_0(ctx context.Context, marshaler ru protoReq ParseYangRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -205,6 +208,7 @@ func request_NetworkElementService_GetPath_0(ctx context.Context, marshaler runt metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") @@ -271,6 +275,7 @@ func request_NetworkElementService_GetIntendedPath_0(ctx context.Context, marsha metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") @@ -361,6 +366,7 @@ func request_NetworkElementService_Delete_0(ctx context.Context, marshaler runti metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["mneid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "mneid") @@ -410,6 +416,7 @@ func request_NetworkElementService_GetChangeList_0(ctx context.Context, marshale protoReq GetChangeListRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -443,6 +450,7 @@ func request_NetworkElementService_GetChange_0(ctx context.Context, marshaler ru metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["cuid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cuid") diff --git a/api/go/gosdn/plugin-internal/plugin-internal.pb.go b/api/go/gosdn/plugin-internal/plugin-internal.pb.go index 6d52ec6b0..5e04dfcd9 100644 --- a/api/go/gosdn/plugin-internal/plugin-internal.pb.go +++ b/api/go/gosdn/plugin-internal/plugin-internal.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/plugin-internal/plugin-internal.proto @@ -164,58 +164,6 @@ func (x *PluginSchemaPayload) GetChunk() []byte { return nil } -type GetAvailablePluginsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Plugins []*plugin_registry.Plugin `protobuf:"bytes,2,rep,name=plugins,proto3" json:"plugins,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetAvailablePluginsResponse) Reset() { - *x = GetAvailablePluginsResponse{} - mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetAvailablePluginsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAvailablePluginsResponse) ProtoMessage() {} - -func (x *GetAvailablePluginsResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_plugin_internal_plugin_internal_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAvailablePluginsResponse.ProtoReflect.Descriptor instead. -func (*GetAvailablePluginsResponse) Descriptor() ([]byte, []int) { - return file_gosdn_plugin_internal_plugin_internal_proto_rawDescGZIP(), []int{3} -} - -func (x *GetAvailablePluginsResponse) GetTimestamp() int64 { - if x != nil { - return x.Timestamp - } - return 0 -} - -func (x *GetAvailablePluginsResponse) GetPlugins() []*plugin_registry.Plugin { - if x != nil { - return x.Plugins - } - return nil -} - var File_gosdn_plugin_internal_plugin_internal_proto protoreflect.FileDescriptor var file_gosdn_plugin_internal_plugin_internal_proto_rawDesc = string([]byte{ @@ -241,42 +189,28 @@ var file_gosdn_plugin_internal_plugin_internal_proto_rawDesc = string([]byte{ 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x13, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x74, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x32, 0xf2, 0x02, - 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x31, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x32, 0x84, 0x02, 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x7b, 0x0a, 0x10, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x73, 0x42, 0x3b, 0x5a, 0x39, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, - 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x6e, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x42, 0x3b, + 0x5a, 0x39, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, + 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, }) var ( @@ -291,28 +225,23 @@ func file_gosdn_plugin_internal_plugin_internal_proto_rawDescGZIP() []byte { return file_gosdn_plugin_internal_plugin_internal_proto_rawDescData } -var file_gosdn_plugin_internal_plugin_internal_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_gosdn_plugin_internal_plugin_internal_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_gosdn_plugin_internal_plugin_internal_proto_goTypes = []any{ (*GetAvailablePluginsRequest)(nil), // 0: gosdn.plugin_internal.GetAvailablePluginsRequest (*GetPluginSchemaRequest)(nil), // 1: gosdn.plugin_internal.GetPluginSchemaRequest (*PluginSchemaPayload)(nil), // 2: gosdn.plugin_internal.PluginSchemaPayload - (*GetAvailablePluginsResponse)(nil), // 3: gosdn.plugin_internal.GetAvailablePluginsResponse - (*plugin_registry.Plugin)(nil), // 4: gosdn.plugin_registry.Plugin - (*plugin_registry.GetResponse)(nil), // 5: gosdn.plugin_registry.GetResponse + (*plugin_registry.GetResponse)(nil), // 3: gosdn.plugin_registry.GetResponse } var file_gosdn_plugin_internal_plugin_internal_proto_depIdxs = []int32{ - 4, // 0: gosdn.plugin_internal.GetAvailablePluginsResponse.plugins:type_name -> gosdn.plugin_registry.Plugin - 0, // 1: gosdn.plugin_internal.PluginInternalService.AvailablePlugins:input_type -> gosdn.plugin_internal.GetAvailablePluginsRequest - 1, // 2: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:input_type -> gosdn.plugin_internal.GetPluginSchemaRequest - 0, // 3: gosdn.plugin_internal.PluginInternalService.GetAvailablePlugins:input_type -> gosdn.plugin_internal.GetAvailablePluginsRequest - 5, // 4: gosdn.plugin_internal.PluginInternalService.AvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse - 2, // 5: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:output_type -> gosdn.plugin_internal.PluginSchemaPayload - 5, // 6: gosdn.plugin_internal.PluginInternalService.GetAvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse - 4, // [4:7] is the sub-list for method output_type - 1, // [1:4] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 0, // 0: gosdn.plugin_internal.PluginInternalService.AvailablePlugins:input_type -> gosdn.plugin_internal.GetAvailablePluginsRequest + 1, // 1: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:input_type -> gosdn.plugin_internal.GetPluginSchemaRequest + 3, // 2: gosdn.plugin_internal.PluginInternalService.AvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse + 2, // 3: gosdn.plugin_internal.PluginInternalService.GetPluginSchema:output_type -> gosdn.plugin_internal.PluginSchemaPayload + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name } func init() { file_gosdn_plugin_internal_plugin_internal_proto_init() } @@ -326,7 +255,7 @@ func file_gosdn_plugin_internal_plugin_internal_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_plugin_internal_plugin_internal_proto_rawDesc), len(file_gosdn_plugin_internal_plugin_internal_proto_rawDesc)), NumEnums: 0, - NumMessages: 4, + NumMessages: 3, NumExtensions: 0, NumServices: 1, }, diff --git a/api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go b/api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go index 9fd179fdf..e319b9d24 100644 --- a/api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go +++ b/api/go/gosdn/plugin-internal/plugin-internal.pb.gw.go @@ -35,24 +35,25 @@ var ( _ = metadata.Join ) -var filter_PluginInternalService_GetAvailablePlugins_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +var filter_PluginInternalService_AvailablePlugins_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -func request_PluginInternalService_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, client PluginInternalServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_PluginInternalService_AvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, client PluginInternalServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq GetAvailablePluginsRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginInternalService_GetAvailablePlugins_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginInternalService_AvailablePlugins_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetAvailablePlugins(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.AvailablePlugins(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_PluginInternalService_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, server PluginInternalServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_PluginInternalService_AvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, server PluginInternalServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq GetAvailablePluginsRequest metadata runtime.ServerMetadata @@ -60,10 +61,10 @@ func local_request_PluginInternalService_GetAvailablePlugins_0(ctx context.Conte if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginInternalService_GetAvailablePlugins_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PluginInternalService_AvailablePlugins_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetAvailablePlugins(ctx, &protoReq) + msg, err := server.AvailablePlugins(ctx, &protoReq) return msg, metadata, err } @@ -73,25 +74,25 @@ func local_request_PluginInternalService_GetAvailablePlugins_0(ctx context.Conte // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPluginInternalServiceHandlerFromEndpoint instead. // GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. func RegisterPluginInternalServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PluginInternalServiceServer) error { - mux.Handle(http.MethodGet, pattern_PluginInternalService_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PluginInternalService_AvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins", runtime.WithHTTPPathPattern("/plugins")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_PluginInternalService_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_PluginInternalService_AvailablePlugins_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PluginInternalService_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_PluginInternalService_AvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) return nil @@ -133,30 +134,30 @@ func RegisterPluginInternalServiceHandler(ctx context.Context, mux *runtime.Serv // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in // "PluginInternalServiceClient" to call the correct interceptors. This client ignores the HTTP middlewares. func RegisterPluginInternalServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PluginInternalServiceClient) error { - mux.Handle(http.MethodGet, pattern_PluginInternalService_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_PluginInternalService_AvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins", runtime.WithHTTPPathPattern("/plugins")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_PluginInternalService_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_PluginInternalService_AvailablePlugins_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_PluginInternalService_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_PluginInternalService_AvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) return nil } var ( - pattern_PluginInternalService_GetAvailablePlugins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"plugins"}, "")) + pattern_PluginInternalService_AvailablePlugins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"plugins"}, "")) ) var ( - forward_PluginInternalService_GetAvailablePlugins_0 = runtime.ForwardResponseMessage + forward_PluginInternalService_AvailablePlugins_0 = runtime.ForwardResponseMessage ) diff --git a/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go b/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go index 31b9539de..eaa452aa3 100644 --- a/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go +++ b/api/go/gosdn/plugin-internal/plugin-internal_grpc.pb.go @@ -20,9 +20,8 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - PluginInternalService_AvailablePlugins_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins" - PluginInternalService_GetPluginSchema_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema" - PluginInternalService_GetAvailablePlugins_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins" + PluginInternalService_AvailablePlugins_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins" + PluginInternalService_GetPluginSchema_FullMethodName = "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema" ) // PluginInternalServiceClient is the client API for PluginInternalService service. @@ -31,7 +30,6 @@ const ( type PluginInternalServiceClient interface { AvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) GetPluginSchema(ctx context.Context, in *GetPluginSchemaRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[PluginSchemaPayload], error) - GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) } type pluginInternalServiceClient struct { @@ -71,23 +69,12 @@ func (c *pluginInternalServiceClient) GetPluginSchema(ctx context.Context, in *G // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type PluginInternalService_GetPluginSchemaClient = grpc.ServerStreamingClient[PluginSchemaPayload] -func (c *pluginInternalServiceClient) GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(plugin_registry.GetResponse) - err := c.cc.Invoke(ctx, PluginInternalService_GetAvailablePlugins_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - // PluginInternalServiceServer is the server API for PluginInternalService service. // All implementations must embed UnimplementedPluginInternalServiceServer // for forward compatibility. type PluginInternalServiceServer interface { AvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) GetPluginSchema(*GetPluginSchemaRequest, grpc.ServerStreamingServer[PluginSchemaPayload]) error - GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) mustEmbedUnimplementedPluginInternalServiceServer() } @@ -104,9 +91,6 @@ func (UnimplementedPluginInternalServiceServer) AvailablePlugins(context.Context func (UnimplementedPluginInternalServiceServer) GetPluginSchema(*GetPluginSchemaRequest, grpc.ServerStreamingServer[PluginSchemaPayload]) error { return status.Errorf(codes.Unimplemented, "method GetPluginSchema not implemented") } -func (UnimplementedPluginInternalServiceServer) GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAvailablePlugins not implemented") -} func (UnimplementedPluginInternalServiceServer) mustEmbedUnimplementedPluginInternalServiceServer() {} func (UnimplementedPluginInternalServiceServer) testEmbeddedByValue() {} @@ -157,24 +141,6 @@ func _PluginInternalService_GetPluginSchema_Handler(srv interface{}, stream grpc // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type PluginInternalService_GetPluginSchemaServer = grpc.ServerStreamingServer[PluginSchemaPayload] -func _PluginInternalService_GetAvailablePlugins_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAvailablePluginsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(PluginInternalServiceServer).GetAvailablePlugins(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: PluginInternalService_GetAvailablePlugins_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(PluginInternalServiceServer).GetAvailablePlugins(ctx, req.(*GetAvailablePluginsRequest)) - } - return interceptor(ctx, in, info, handler) -} - // PluginInternalService_ServiceDesc is the grpc.ServiceDesc for PluginInternalService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -186,10 +152,6 @@ var PluginInternalService_ServiceDesc = grpc.ServiceDesc{ MethodName: "AvailablePlugins", Handler: _PluginInternalService_AvailablePlugins_Handler, }, - { - MethodName: "GetAvailablePlugins", - Handler: _PluginInternalService_GetAvailablePlugins_Handler, - }, }, Streams: []grpc.StreamDesc{ { diff --git a/api/go/gosdn/plugin-registry/plugin-registry.pb.go b/api/go/gosdn/plugin-registry/plugin-registry.pb.go index ed6853721..66ded0daf 100644 --- a/api/go/gosdn/plugin-registry/plugin-registry.pb.go +++ b/api/go/gosdn/plugin-registry/plugin-registry.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/plugin-registry/plugin-registry.proto diff --git a/api/go/gosdn/plugin/plugin.pb.go b/api/go/gosdn/plugin/plugin.pb.go index 273425267..9f4ca7edd 100644 --- a/api/go/gosdn/plugin/plugin.pb.go +++ b/api/go/gosdn/plugin/plugin.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/plugin/plugin.proto diff --git a/api/go/gosdn/pnd/pnd.pb.go b/api/go/gosdn/pnd/pnd.pb.go index 71b33fdd0..8d056e2d8 100644 --- a/api/go/gosdn/pnd/pnd.pb.go +++ b/api/go/gosdn/pnd/pnd.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/pnd/pnd.proto diff --git a/api/go/gosdn/pnd/pnd.pb.gw.go b/api/go/gosdn/pnd/pnd.pb.gw.go index 7ea08d765..f24e132eb 100644 --- a/api/go/gosdn/pnd/pnd.pb.gw.go +++ b/api/go/gosdn/pnd/pnd.pb.gw.go @@ -43,6 +43,7 @@ func request_PndService_GetPnd_0(ctx context.Context, marshaler runtime.Marshale metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") @@ -92,6 +93,7 @@ func request_PndService_GetPndList_0(ctx context.Context, marshaler runtime.Mars protoReq GetPndListRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -149,6 +151,7 @@ func request_PndService_DeletePnd_0(ctx context.Context, marshaler runtime.Marsh metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["pid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid") diff --git a/api/go/gosdn/rbac/rbac.pb.go b/api/go/gosdn/rbac/rbac.pb.go index 29e570c59..619331c55 100644 --- a/api/go/gosdn/rbac/rbac.pb.go +++ b/api/go/gosdn/rbac/rbac.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/rbac/rbac.proto diff --git a/api/go/gosdn/rbac/rbac.pb.gw.go b/api/go/gosdn/rbac/rbac.pb.gw.go index 6a89867f0..529d8c78d 100644 --- a/api/go/gosdn/rbac/rbac.pb.gw.go +++ b/api/go/gosdn/rbac/rbac.pb.gw.go @@ -67,6 +67,7 @@ func request_AuthService_Logout_0(ctx context.Context, marshaler runtime.Marshal metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") diff --git a/api/go/gosdn/rbac/role.pb.go b/api/go/gosdn/rbac/role.pb.go index 66c89c2f7..d8ed4796b 100644 --- a/api/go/gosdn/rbac/role.pb.go +++ b/api/go/gosdn/rbac/role.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/rbac/role.proto diff --git a/api/go/gosdn/rbac/role.pb.gw.go b/api/go/gosdn/rbac/role.pb.gw.go index a30fb131d..e77d968ec 100644 --- a/api/go/gosdn/rbac/role.pb.gw.go +++ b/api/go/gosdn/rbac/role.pb.gw.go @@ -66,6 +66,7 @@ func request_RoleService_GetRole_0(ctx context.Context, marshaler runtime.Marsha protoReq GetRoleRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -98,6 +99,7 @@ func request_RoleService_GetRoles_0(ctx context.Context, marshaler runtime.Marsh protoReq GetRolesRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -154,6 +156,7 @@ func request_RoleService_DeletePermissionsForRole_0(ctx context.Context, marshal protoReq DeletePermissionsForRoleRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -186,6 +189,7 @@ func request_RoleService_DeleteRoles_0(ctx context.Context, marshaler runtime.Ma protoReq DeleteRolesRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } diff --git a/api/go/gosdn/rbac/user.pb.go b/api/go/gosdn/rbac/user.pb.go index 6c413ce8c..b134dea8d 100644 --- a/api/go/gosdn/rbac/user.pb.go +++ b/api/go/gosdn/rbac/user.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/rbac/user.proto diff --git a/api/go/gosdn/rbac/user.pb.gw.go b/api/go/gosdn/rbac/user.pb.gw.go index ebe07c3c0..36d72ee8b 100644 --- a/api/go/gosdn/rbac/user.pb.gw.go +++ b/api/go/gosdn/rbac/user.pb.gw.go @@ -66,6 +66,7 @@ func request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marsha protoReq GetUserRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -98,6 +99,7 @@ func request_UserService_GetUsers_0(ctx context.Context, marshaler runtime.Marsh protoReq GetUsersRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -154,6 +156,7 @@ func request_UserService_DeleteUsers_0(ctx context.Context, marshaler runtime.Ma protoReq DeleteUsersRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } diff --git a/api/go/gosdn/southbound/southbound.pb.go b/api/go/gosdn/southbound/southbound.pb.go index ea26197dc..045cbcd9b 100644 --- a/api/go/gosdn/southbound/southbound.pb.go +++ b/api/go/gosdn/southbound/southbound.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/southbound/southbound.proto diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go index 6bfb0e28a..80e99f1c3 100644 --- a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go +++ b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/subscriptionmanagement/subscriptionmanagement.proto diff --git a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go index 40aebfa6e..4c9ccd9a2 100644 --- a/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go +++ b/api/go/gosdn/subscriptionmanagement/subscriptionmanagement.pb.gw.go @@ -42,6 +42,7 @@ func request_SubscriptionManagementService_GetAll_0(ctx context.Context, marshal protoReq GetAllRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -75,6 +76,7 @@ func request_SubscriptionManagementService_Get_0(ctx context.Context, marshaler metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["subid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "subid") @@ -125,6 +127,7 @@ func request_SubscriptionManagementService_Delete_0(ctx context.Context, marshal metadata runtime.ServerMetadata err error ) + io.Copy(io.Discard, req.Body) val, ok := pathParams["subid"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "subid") @@ -216,6 +219,7 @@ func request_SubscriptionManagementService_ResetAllSubscriptions_0(ctx context.C protoReq ResetAllSubscriptionsRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } diff --git a/api/go/gosdn/topology/link.pb.go b/api/go/gosdn/topology/link.pb.go index d18acbd1b..a3822b612 100644 --- a/api/go/gosdn/topology/link.pb.go +++ b/api/go/gosdn/topology/link.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/topology/link.proto diff --git a/api/go/gosdn/topology/node.pb.go b/api/go/gosdn/topology/node.pb.go index d9c0e5af1..f985e87eb 100644 --- a/api/go/gosdn/topology/node.pb.go +++ b/api/go/gosdn/topology/node.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/topology/node.proto diff --git a/api/go/gosdn/topology/port.pb.go b/api/go/gosdn/topology/port.pb.go index 383452572..536af7053 100644 --- a/api/go/gosdn/topology/port.pb.go +++ b/api/go/gosdn/topology/port.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/topology/port.proto diff --git a/api/go/gosdn/topology/route.pb.go b/api/go/gosdn/topology/route.pb.go index f4472000e..81485b54b 100644 --- a/api/go/gosdn/topology/route.pb.go +++ b/api/go/gosdn/topology/route.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/topology/route.proto diff --git a/api/go/gosdn/topology/routingTable.pb.go b/api/go/gosdn/topology/routingTable.pb.go index d7b791f34..d694dcbc4 100644 --- a/api/go/gosdn/topology/routingTable.pb.go +++ b/api/go/gosdn/topology/routingTable.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/topology/routingTable.proto diff --git a/api/go/gosdn/topology/routingTable.pb.gw.go b/api/go/gosdn/topology/routingTable.pb.gw.go index 4bcd1b743..38438fcd9 100644 --- a/api/go/gosdn/topology/routingTable.pb.gw.go +++ b/api/go/gosdn/topology/routingTable.pb.gw.go @@ -66,6 +66,7 @@ func request_RoutingTableService_GetRoutes_0(ctx context.Context, marshaler runt protoReq GetRoutesRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -98,6 +99,7 @@ func request_RoutingTableService_DeleteRoute_0(ctx context.Context, marshaler ru protoReq DeleteRoutesRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } diff --git a/api/go/gosdn/topology/topology.pb.go b/api/go/gosdn/topology/topology.pb.go index 073a288f8..91048f409 100644 --- a/api/go/gosdn/topology/topology.pb.go +++ b/api/go/gosdn/topology/topology.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/topology/topology.proto diff --git a/api/go/gosdn/topology/topology.pb.gw.go b/api/go/gosdn/topology/topology.pb.gw.go index d4587d504..b1c324665 100644 --- a/api/go/gosdn/topology/topology.pb.gw.go +++ b/api/go/gosdn/topology/topology.pb.gw.go @@ -66,6 +66,7 @@ func request_TopologyService_GetTopology_0(ctx context.Context, marshaler runtim protoReq GetTopologyRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -122,6 +123,7 @@ func request_TopologyService_DeleteLink_0(ctx context.Context, marshaler runtime protoReq DeleteLinkRequest metadata runtime.ServerMetadata ) + io.Copy(io.Discard, req.Body) if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } diff --git a/api/go/gosdn/transport/transport.pb.go b/api/go/gosdn/transport/transport.pb.go index 22768e44c..c81ab6506 100644 --- a/api/go/gosdn/transport/transport.pb.go +++ b/api/go/gosdn/transport/transport.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc (unknown) // source: gosdn/transport/transport.proto diff --git a/api/openapiv2/gosdn_northbound.swagger.json b/api/openapiv2/gosdn_northbound.swagger.json index a000de65c..d5a7d045d 100644 --- a/api/openapiv2/gosdn_northbound.swagger.json +++ b/api/openapiv2/gosdn_northbound.swagger.json @@ -711,7 +711,7 @@ }, "/plugins": { "get": { - "operationId": "PluginInternalService_GetAvailablePlugins", + "operationId": "PluginInternalService_AvailablePlugins", "responses": { "200": { "description": "A successful response.", diff --git a/api/proto/gosdn/plugin-internal/plugin-internal.proto b/api/proto/gosdn/plugin-internal/plugin-internal.proto index 70ad2e22f..21fb8663b 100644 --- a/api/proto/gosdn/plugin-internal/plugin-internal.proto +++ b/api/proto/gosdn/plugin-internal/plugin-internal.proto @@ -10,11 +10,10 @@ import "google/api/annotations.proto"; option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-internal"; service PluginInternalService { - rpc AvailablePlugins(GetAvailablePluginsRequest) returns (gosdn.plugin_registry.GetResponse); - rpc GetPluginSchema(GetPluginSchemaRequest) returns (stream PluginSchemaPayload); - rpc GetAvailablePlugins(GetAvailablePluginsRequest) returns (gosdn.plugin_registry.GetResponse) { + rpc AvailablePlugins(GetAvailablePluginsRequest) returns (gosdn.plugin_registry.GetResponse){ option (google.api.http) = {get: "/plugins"}; -} + }; + rpc GetPluginSchema(GetPluginSchemaRequest) returns (stream PluginSchemaPayload); } message GetAvailablePluginsRequest { @@ -29,8 +28,3 @@ message GetPluginSchemaRequest { message PluginSchemaPayload { bytes chunk = 1; } - -message GetAvailablePluginsResponse { - int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. - repeated gosdn.plugin_registry.Plugin plugins = 2; -} \ No newline at end of file diff --git a/controller/northbound/server/plugin.go b/controller/northbound/server/plugin.go index 25f4b3cff..3338520da 100644 --- a/controller/northbound/server/plugin.go +++ b/controller/northbound/server/plugin.go @@ -55,21 +55,6 @@ func (pis *PluginInternalServer) AvailablePlugins(ctx context.Context, request * return pis.pluginRegistryClient.GetAll(ctx, getAllRequest) } -func (pis *PluginInternalServer) GetAvailablePlugins(ctx context.Context, request *pipb.GetAvailablePluginsRequest) (*rpb.GetResponse, error) { - ctx, cancel := context.WithTimeout(ctx, time.Minute*1) - defer cancel() - - if err := pis.protoValidator.Validate(request); err != nil { - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - getAllRequest := &rpb.GetAllRequest{ - Timestamp: time.Now().UnixNano(), - } - - return pis.pluginRegistryClient.GetAll(ctx, getAllRequest) -} - func (pis *PluginInternalServer) GetPluginSchema(request *pipb.GetPluginSchemaRequest, stream pipb.PluginInternalService_GetPluginSchemaServer) error { labels := prometheus.Labels{"service": "plugin", "rpc": "get plugin schema"} start := metrics.StartHook(labels, grpcRequestsTotal) -- GitLab From 3c0ef74a19cab82d1c524e9e23bd69e591a053bb Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 6 Mar 2025 11:46:09 +0100 Subject: [PATCH 76/78] remove yang parser endpoint --- .../gosdn/networkelement/networkelement.pb.go | 1085 ++++++++--------- .../networkelement/networkelement.pb.gw.go | 72 -- .../networkelement/networkelement_grpc.pb.go | 42 - api/openapiv2/gosdn_northbound.swagger.json | 52 - .../gosdn/networkelement/networkelement.proto | 18 - .../northbound/server/networkElement.go | 32 - 6 files changed, 480 insertions(+), 821 deletions(-) diff --git a/api/go/gosdn/networkelement/networkelement.pb.go b/api/go/gosdn/networkelement/networkelement.pb.go index 9eb67529e..78d740a42 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.go +++ b/api/go/gosdn/networkelement/networkelement.pb.go @@ -801,110 +801,6 @@ func (x *GetAllFlattenedResponse) GetMne() []*FlattenedManagedNetworkElement { return nil } -type ParseYangRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Yang string `protobuf:"bytes,2,opt,name=yang,proto3" json:"yang,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ParseYangRequest) Reset() { - *x = ParseYangRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ParseYangRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ParseYangRequest) ProtoMessage() {} - -func (x *ParseYangRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ParseYangRequest.ProtoReflect.Descriptor instead. -func (*ParseYangRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{8} -} - -func (x *ParseYangRequest) GetTimestamp() int64 { - if x != nil { - return x.Timestamp - } - return 0 -} - -func (x *ParseYangRequest) GetYang() string { - if x != nil { - return x.Yang - } - return "" -} - -type ParseYangResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Json string `protobuf:"bytes,2,opt,name=json,proto3" json:"json,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ParseYangResponse) Reset() { - *x = ParseYangResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ParseYangResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ParseYangResponse) ProtoMessage() {} - -func (x *ParseYangResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ParseYangResponse.ProtoReflect.Descriptor instead. -func (*ParseYangResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{9} -} - -func (x *ParseYangResponse) GetTimestamp() int64 { - if x != nil { - return x.Timestamp - } - return 0 -} - -func (x *ParseYangResponse) GetJson() string { - if x != nil { - return x.Json - } - return "" -} - type GetRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. @@ -916,7 +812,7 @@ type GetRequest struct { func (x *GetRequest) Reset() { *x = GetRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -928,7 +824,7 @@ func (x *GetRequest) String() string { func (*GetRequest) ProtoMessage() {} func (x *GetRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -941,7 +837,7 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRequest.ProtoReflect.Descriptor instead. func (*GetRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{10} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{8} } func (x *GetRequest) GetTimestamp() int64 { @@ -978,7 +874,7 @@ type GetResponse struct { func (x *GetResponse) Reset() { *x = GetResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -990,7 +886,7 @@ func (x *GetResponse) String() string { func (*GetResponse) ProtoMessage() {} func (x *GetResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1003,7 +899,7 @@ func (x *GetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetResponse.ProtoReflect.Descriptor instead. func (*GetResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{11} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{9} } func (x *GetResponse) GetTimestamp() int64 { @@ -1038,7 +934,7 @@ type GetFlattenedRequest struct { func (x *GetFlattenedRequest) Reset() { *x = GetFlattenedRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1050,7 +946,7 @@ func (x *GetFlattenedRequest) String() string { func (*GetFlattenedRequest) ProtoMessage() {} func (x *GetFlattenedRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1063,7 +959,7 @@ func (x *GetFlattenedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFlattenedRequest.ProtoReflect.Descriptor instead. func (*GetFlattenedRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{12} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{10} } func (x *GetFlattenedRequest) GetTimestamp() int64 { @@ -1100,7 +996,7 @@ type GetFlattenedResponse struct { func (x *GetFlattenedResponse) Reset() { *x = GetFlattenedResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1112,7 +1008,7 @@ func (x *GetFlattenedResponse) String() string { func (*GetFlattenedResponse) ProtoMessage() {} func (x *GetFlattenedResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1125,7 +1021,7 @@ func (x *GetFlattenedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFlattenedResponse.ProtoReflect.Descriptor instead. func (*GetFlattenedResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{13} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{11} } func (x *GetFlattenedResponse) GetTimestamp() int64 { @@ -1164,7 +1060,7 @@ type SetMne struct { func (x *SetMne) Reset() { *x = SetMne{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1176,7 +1072,7 @@ func (x *SetMne) String() string { func (*SetMne) ProtoMessage() {} func (x *SetMne) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1189,7 +1085,7 @@ func (x *SetMne) ProtoReflect() protoreflect.Message { // Deprecated: Use SetMne.ProtoReflect.Descriptor instead. func (*SetMne) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{14} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{12} } func (x *SetMne) GetAddress() string { @@ -1252,7 +1148,7 @@ type AddListRequest struct { func (x *AddListRequest) Reset() { *x = AddListRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1264,7 +1160,7 @@ func (x *AddListRequest) String() string { func (*AddListRequest) ProtoMessage() {} func (x *AddListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1277,7 +1173,7 @@ func (x *AddListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddListRequest.ProtoReflect.Descriptor instead. func (*AddListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{15} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{13} } func (x *AddListRequest) GetTimestamp() int64 { @@ -1311,7 +1207,7 @@ type AddListResponse struct { func (x *AddListResponse) Reset() { *x = AddListResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1323,7 +1219,7 @@ func (x *AddListResponse) String() string { func (*AddListResponse) ProtoMessage() {} func (x *AddListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1336,7 +1232,7 @@ func (x *AddListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddListResponse.ProtoReflect.Descriptor instead. func (*AddListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{16} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{14} } func (x *AddListResponse) GetTimestamp() int64 { @@ -1365,7 +1261,7 @@ type GetPathRequest struct { func (x *GetPathRequest) Reset() { *x = GetPathRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1377,7 +1273,7 @@ func (x *GetPathRequest) String() string { func (*GetPathRequest) ProtoMessage() {} func (x *GetPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1390,7 +1286,7 @@ func (x *GetPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPathRequest.ProtoReflect.Descriptor instead. func (*GetPathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{17} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{15} } func (x *GetPathRequest) GetTimestamp() int64 { @@ -1434,7 +1330,7 @@ type GetPathResponse struct { func (x *GetPathResponse) Reset() { *x = GetPathResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1446,7 +1342,7 @@ func (x *GetPathResponse) String() string { func (*GetPathResponse) ProtoMessage() {} func (x *GetPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1459,7 +1355,7 @@ func (x *GetPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPathResponse.ProtoReflect.Descriptor instead. func (*GetPathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{18} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{16} } func (x *GetPathResponse) GetTimestamp() int64 { @@ -1495,7 +1391,7 @@ type GetIntendedPathRequest struct { func (x *GetIntendedPathRequest) Reset() { *x = GetIntendedPathRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1507,7 +1403,7 @@ func (x *GetIntendedPathRequest) String() string { func (*GetIntendedPathRequest) ProtoMessage() {} func (x *GetIntendedPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1520,7 +1416,7 @@ func (x *GetIntendedPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetIntendedPathRequest.ProtoReflect.Descriptor instead. func (*GetIntendedPathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{19} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{17} } func (x *GetIntendedPathRequest) GetTimestamp() int64 { @@ -1562,7 +1458,7 @@ type GetIntendedPathResponse struct { func (x *GetIntendedPathResponse) Reset() { *x = GetIntendedPathResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1574,7 +1470,7 @@ func (x *GetIntendedPathResponse) String() string { func (*GetIntendedPathResponse) ProtoMessage() {} func (x *GetIntendedPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1587,7 +1483,7 @@ func (x *GetIntendedPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetIntendedPathResponse.ProtoReflect.Descriptor instead. func (*GetIntendedPathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{20} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{18} } func (x *GetIntendedPathResponse) GetTimestamp() int64 { @@ -1621,7 +1517,7 @@ type SetResponse struct { func (x *SetResponse) Reset() { *x = SetResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1633,7 +1529,7 @@ func (x *SetResponse) String() string { func (*SetResponse) ProtoMessage() {} func (x *SetResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1646,7 +1542,7 @@ func (x *SetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetResponse.ProtoReflect.Descriptor instead. func (*SetResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{21} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{19} } func (x *SetResponse) GetTimestamp() int64 { @@ -1674,7 +1570,7 @@ type SetPathListRequest struct { func (x *SetPathListRequest) Reset() { *x = SetPathListRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1686,7 +1582,7 @@ func (x *SetPathListRequest) String() string { func (*SetPathListRequest) ProtoMessage() {} func (x *SetPathListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1699,7 +1595,7 @@ func (x *SetPathListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPathListRequest.ProtoReflect.Descriptor instead. func (*SetPathListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{22} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{20} } func (x *SetPathListRequest) GetTimestamp() int64 { @@ -1733,7 +1629,7 @@ type SetPathListResponse struct { func (x *SetPathListResponse) Reset() { *x = SetPathListResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1745,7 +1641,7 @@ func (x *SetPathListResponse) String() string { func (*SetPathListResponse) ProtoMessage() {} func (x *SetPathListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1758,7 +1654,7 @@ func (x *SetPathListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPathListResponse.ProtoReflect.Descriptor instead. func (*SetPathListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{23} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{21} } func (x *SetPathListResponse) GetTimestamp() int64 { @@ -1786,7 +1682,7 @@ type DeleteRequest struct { func (x *DeleteRequest) Reset() { *x = DeleteRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1798,7 +1694,7 @@ func (x *DeleteRequest) String() string { func (*DeleteRequest) ProtoMessage() {} func (x *DeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1811,7 +1707,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead. func (*DeleteRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{24} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{22} } func (x *DeleteRequest) GetTimestamp() int64 { @@ -1844,7 +1740,7 @@ type DeleteResponse struct { func (x *DeleteResponse) Reset() { *x = DeleteResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1856,7 +1752,7 @@ func (x *DeleteResponse) String() string { func (*DeleteResponse) ProtoMessage() {} func (x *DeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1869,7 +1765,7 @@ func (x *DeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead. func (*DeleteResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{25} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{23} } func (x *DeleteResponse) GetTimestamp() int64 { @@ -1891,7 +1787,7 @@ type Change struct { func (x *Change) Reset() { *x = Change{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1903,7 +1799,7 @@ func (x *Change) String() string { func (*Change) ProtoMessage() {} func (x *Change) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1916,7 +1812,7 @@ func (x *Change) ProtoReflect() protoreflect.Message { // Deprecated: Use Change.ProtoReflect.Descriptor instead. func (*Change) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{26} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{24} } func (x *Change) GetId() string { @@ -1959,7 +1855,7 @@ type ChangeRequest struct { func (x *ChangeRequest) Reset() { *x = ChangeRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1971,7 +1867,7 @@ func (x *ChangeRequest) String() string { func (*ChangeRequest) ProtoMessage() {} func (x *ChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1984,7 +1880,7 @@ func (x *ChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRequest.ProtoReflect.Descriptor instead. func (*ChangeRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{27} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{25} } func (x *ChangeRequest) GetMneid() string { @@ -2025,7 +1921,7 @@ type SetChange struct { func (x *SetChange) Reset() { *x = SetChange{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2037,7 +1933,7 @@ func (x *SetChange) String() string { func (*SetChange) ProtoMessage() {} func (x *SetChange) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2050,7 +1946,7 @@ func (x *SetChange) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChange.ProtoReflect.Descriptor instead. func (*SetChange) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{28} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{26} } func (x *SetChange) GetCuid() string { @@ -2077,7 +1973,7 @@ type GetChangeListRequest struct { func (x *GetChangeListRequest) Reset() { *x = GetChangeListRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2089,7 +1985,7 @@ func (x *GetChangeListRequest) String() string { func (*GetChangeListRequest) ProtoMessage() {} func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2102,7 +1998,7 @@ func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeListRequest.ProtoReflect.Descriptor instead. func (*GetChangeListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{29} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{27} } func (x *GetChangeListRequest) GetTimestamp() int64 { @@ -2132,7 +2028,7 @@ type GetChangeListResponse struct { func (x *GetChangeListResponse) Reset() { *x = GetChangeListResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2144,7 +2040,7 @@ func (x *GetChangeListResponse) String() string { func (*GetChangeListResponse) ProtoMessage() {} func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2157,7 +2053,7 @@ func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeListResponse.ProtoReflect.Descriptor instead. func (*GetChangeListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{30} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{28} } func (x *GetChangeListResponse) GetTimestamp() int64 { @@ -2192,7 +2088,7 @@ type GetChangeRequest struct { func (x *GetChangeRequest) Reset() { *x = GetChangeRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2204,7 +2100,7 @@ func (x *GetChangeRequest) String() string { func (*GetChangeRequest) ProtoMessage() {} func (x *GetChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2217,7 +2113,7 @@ func (x *GetChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeRequest.ProtoReflect.Descriptor instead. func (*GetChangeRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{31} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{29} } func (x *GetChangeRequest) GetTimestamp() int64 { @@ -2254,7 +2150,7 @@ type GetChangeResponse struct { func (x *GetChangeResponse) Reset() { *x = GetChangeResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2266,7 +2162,7 @@ func (x *GetChangeResponse) String() string { func (*GetChangeResponse) ProtoMessage() {} func (x *GetChangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2279,7 +2175,7 @@ func (x *GetChangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeResponse.ProtoReflect.Descriptor instead. func (*GetChangeResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{32} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{30} } func (x *GetChangeResponse) GetTimestamp() int64 { @@ -2314,7 +2210,7 @@ type SetChangeListRequest struct { func (x *SetChangeListRequest) Reset() { *x = SetChangeListRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2326,7 +2222,7 @@ func (x *SetChangeListRequest) String() string { func (*SetChangeListRequest) ProtoMessage() {} func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2339,7 +2235,7 @@ func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChangeListRequest.ProtoReflect.Descriptor instead. func (*SetChangeListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{33} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{31} } func (x *SetChangeListRequest) GetTimestamp() int64 { @@ -2373,7 +2269,7 @@ type SetChangeListResponse struct { func (x *SetChangeListResponse) Reset() { *x = SetChangeListResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2385,7 +2281,7 @@ func (x *SetChangeListResponse) String() string { func (*SetChangeListResponse) ProtoMessage() {} func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2398,7 +2294,7 @@ func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChangeListResponse.ProtoReflect.Descriptor instead. func (*SetChangeListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{34} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{32} } func (x *SetChangeListResponse) GetTimestamp() int64 { @@ -2427,7 +2323,7 @@ type SubscriptionList struct { func (x *SubscriptionList) Reset() { *x = SubscriptionList{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2439,7 +2335,7 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2452,7 +2348,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{35} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{33} } func (x *SubscriptionList) GetSubscription() []*Subscription { @@ -2480,7 +2376,7 @@ type Subscription struct { func (x *Subscription) Reset() { *x = Subscription{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2492,7 +2388,7 @@ func (x *Subscription) String() string { func (*Subscription) ProtoMessage() {} func (x *Subscription) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2505,7 +2401,7 @@ func (x *Subscription) ProtoReflect() protoreflect.Message { // Deprecated: Use Subscription.ProtoReflect.Descriptor instead. func (*Subscription) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{36} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{34} } func (x *Subscription) GetPath() string { @@ -2541,7 +2437,7 @@ type SubscribePathRequest struct { func (x *SubscribePathRequest) Reset() { *x = SubscribePathRequest{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[37] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2553,7 +2449,7 @@ func (x *SubscribePathRequest) String() string { func (*SubscribePathRequest) ProtoMessage() {} func (x *SubscribePathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[37] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2566,7 +2462,7 @@ func (x *SubscribePathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribePathRequest.ProtoReflect.Descriptor instead. func (*SubscribePathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{37} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{35} } func (x *SubscribePathRequest) GetTimestamp() int64 { @@ -2607,7 +2503,7 @@ type SubscribePathResponse struct { func (x *SubscribePathResponse) Reset() { *x = SubscribePathResponse{} - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[38] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2619,7 +2515,7 @@ func (x *SubscribePathResponse) String() string { func (*SubscribePathResponse) ProtoMessage() {} func (x *SubscribePathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[38] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2632,7 +2528,7 @@ func (x *SubscribePathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribePathResponse.ProtoReflect.Descriptor instead. func (*SubscribePathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{38} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{36} } func (x *SubscribePathResponse) GetTimestamp() int64 { @@ -2756,343 +2652,326 @@ var file_gosdn_networkelement_networkelement_proto_rawDesc = string([]byte{ 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, - 0x6e, 0x65, 0x22, 0x4c, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x6e, 0x65, 0x22, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, + 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, + 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x04, 0x79, 0x61, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x79, 0x61, 0x6e, 0x67, - 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, - 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, - 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, - 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, - 0x70, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x6b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, + 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, + 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xb1, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, + 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, + 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, + 0x64, 0x12, 0x46, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x06, 0x53, 0x65, + 0x74, 0x4d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x12, 0x67, 0x6e, 0x6d, 0x69, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x6e, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x80, 0x01, + 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, + 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x22, 0x70, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x6b, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, - 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, - 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, - 0x69, 0x64, 0x22, 0xb1, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, - 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, + 0x64, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, + 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, + 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x46, - 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x4d, 0x6e, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6e, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6e, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x12, 0x67, 0x6e, 0x6d, 0x69, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x0e, 0x41, - 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, + 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, + 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, + 0x6e, 0x65, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, + 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x40, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, + 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, 0x61, + 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x03, 0x6d, - 0x6e, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, - 0x6d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x70, 0x0a, - 0x0f, 0x41, 0x64, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0e, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x13, 0x53, 0x65, 0x74, + 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, - 0x82, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x5d, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x22, 0x2e, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, + 0x01, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0xa8, 0x01, 0x0a, + 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, + 0x6e, 0x65, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x06, + 0x61, 0x70, 0x69, 0x5f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x05, 0x61, 0x70, 0x69, 0x4f, 0x70, 0x22, 0x50, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x4e, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x66, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, + 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, + 0x03, 0x70, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, + 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, + 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x76, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0xa8, 0x01, + 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x50, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x1a, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x03, 0x70, 0x69, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, - 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, - 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, - 0x64, 0x12, 0x2b, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x40, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, - 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, - 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x5d, 0x0a, 0x0d, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1c, 0x0a, - 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x01, 0x0a, 0x06, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0xa8, 0x01, 0x0a, 0x0d, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, - 0x6e, 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, - 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x61, 0x70, 0x69, - 0x5f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x61, - 0x70, 0x69, 0x4f, 0x70, 0x22, 0x50, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x4e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x03, - 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, - 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, - 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, - 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x66, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x04, 0x63, - 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, 0x69, - 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, - 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x22, 0x8f, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x03, 0x70, - 0x69, 0x64, 0x22, 0x76, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x74, 0x22, 0x74, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x10, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x50, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, - 0x02, 0x08, 0x01, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x42, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, - 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x03, 0x70, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x06, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x74, 0x22, - 0x74, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1a, 0x0a, - 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, - 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, - 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, - 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, - 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x19, 0x0a, - 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, - 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, - 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, - 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, - 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x03, 0x2a, 0x8b, 0x01, - 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, - 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x43, 0x45, 0x10, - 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x02, 0x12, - 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x10, 0x03, 0x2a, 0x7c, 0x0a, 0x0a, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x52, - 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, - 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x46, - 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, - 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, - 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, - 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x03, 0x32, 0xa2, 0x0e, 0x0a, 0x15, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x31, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, + 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x41, 0x4e, + 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, + 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, 0x4e, + 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e, 0x53, 0x49, + 0x53, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49, 0x5f, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, + 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, + 0x12, 0x19, 0x0a, 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x41, + 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, + 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, + 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x03, + 0x2a, 0x8b, 0x01, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, + 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, + 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, + 0x43, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, + 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x10, 0x03, 0x2a, 0x7c, + 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, + 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, + 0x47, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, + 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x03, 0x32, 0xaf, 0x0d, 0x0a, + 0x15, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, - 0x22, 0x17, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x53, 0x0a, 0x06, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, - 0x64, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, - 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x6c, 0x61, - 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x12, 0x61, 0x0a, - 0x03, 0x47, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x53, 0x0a, 0x06, + 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x12, 0x0d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x7d, - 0x12, 0x71, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x12, 0x26, 0x2e, - 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x72, - 0x73, 0x65, 0x59, 0x61, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x79, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x7d, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x6c, 0x61, 0x74, 0x74, + 0x65, 0x6e, 0x65, 0x64, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, + 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x6d, 0x6e, 0x65, 0x73, + 0x12, 0x61, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, + 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, + 0x69, 0x64, 0x7d, 0x12, 0x65, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, @@ -3189,7 +3068,7 @@ func file_gosdn_networkelement_networkelement_proto_rawDescGZIP() []byte { } var file_gosdn_networkelement_networkelement_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_gosdn_networkelement_networkelement_proto_msgTypes = make([]protoimpl.MessageInfo, 39) +var file_gosdn_networkelement_networkelement_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_gosdn_networkelement_networkelement_proto_goTypes = []any{ (ChangeState)(0), // 0: gosdn.networkelement.ChangeState (ApiOperation)(0), // 1: gosdn.networkelement.ApiOperation @@ -3204,117 +3083,113 @@ var file_gosdn_networkelement_networkelement_proto_goTypes = []any{ (*GetAllResponse)(nil), // 10: gosdn.networkelement.GetAllResponse (*GetAllFlattenedRequest)(nil), // 11: gosdn.networkelement.GetAllFlattenedRequest (*GetAllFlattenedResponse)(nil), // 12: gosdn.networkelement.GetAllFlattenedResponse - (*ParseYangRequest)(nil), // 13: gosdn.networkelement.ParseYangRequest - (*ParseYangResponse)(nil), // 14: gosdn.networkelement.ParseYangResponse - (*GetRequest)(nil), // 15: gosdn.networkelement.GetRequest - (*GetResponse)(nil), // 16: gosdn.networkelement.GetResponse - (*GetFlattenedRequest)(nil), // 17: gosdn.networkelement.GetFlattenedRequest - (*GetFlattenedResponse)(nil), // 18: gosdn.networkelement.GetFlattenedResponse - (*SetMne)(nil), // 19: gosdn.networkelement.SetMne - (*AddListRequest)(nil), // 20: gosdn.networkelement.AddListRequest - (*AddListResponse)(nil), // 21: gosdn.networkelement.AddListResponse - (*GetPathRequest)(nil), // 22: gosdn.networkelement.GetPathRequest - (*GetPathResponse)(nil), // 23: gosdn.networkelement.GetPathResponse - (*GetIntendedPathRequest)(nil), // 24: gosdn.networkelement.GetIntendedPathRequest - (*GetIntendedPathResponse)(nil), // 25: gosdn.networkelement.GetIntendedPathResponse - (*SetResponse)(nil), // 26: gosdn.networkelement.SetResponse - (*SetPathListRequest)(nil), // 27: gosdn.networkelement.SetPathListRequest - (*SetPathListResponse)(nil), // 28: gosdn.networkelement.SetPathListResponse - (*DeleteRequest)(nil), // 29: gosdn.networkelement.DeleteRequest - (*DeleteResponse)(nil), // 30: gosdn.networkelement.DeleteResponse - (*Change)(nil), // 31: gosdn.networkelement.Change - (*ChangeRequest)(nil), // 32: gosdn.networkelement.ChangeRequest - (*SetChange)(nil), // 33: gosdn.networkelement.SetChange - (*GetChangeListRequest)(nil), // 34: gosdn.networkelement.GetChangeListRequest - (*GetChangeListResponse)(nil), // 35: gosdn.networkelement.GetChangeListResponse - (*GetChangeRequest)(nil), // 36: gosdn.networkelement.GetChangeRequest - (*GetChangeResponse)(nil), // 37: gosdn.networkelement.GetChangeResponse - (*SetChangeListRequest)(nil), // 38: gosdn.networkelement.SetChangeListRequest - (*SetChangeListResponse)(nil), // 39: gosdn.networkelement.SetChangeListResponse - (*SubscriptionList)(nil), // 40: gosdn.networkelement.SubscriptionList - (*Subscription)(nil), // 41: gosdn.networkelement.Subscription - (*SubscribePathRequest)(nil), // 42: gosdn.networkelement.SubscribePathRequest - (*SubscribePathResponse)(nil), // 43: gosdn.networkelement.SubscribePathResponse - (*plugin_registry.Plugin)(nil), // 44: gosdn.plugin_registry.Plugin - (*gnmi.Notification)(nil), // 45: gnmi.Notification - (*transport.TransportOption)(nil), // 46: gosdn.transport.TransportOption - (*conflict.Metadata)(nil), // 47: gosdn.conflict.Metadata - (*pnd.PrincipalNetworkDomain)(nil), // 48: gosdn.pnd.PrincipalNetworkDomain - (*gnmi.Path)(nil), // 49: gnmi.Path - (*gnmi.TypedValue)(nil), // 50: gnmi.TypedValue + (*GetRequest)(nil), // 13: gosdn.networkelement.GetRequest + (*GetResponse)(nil), // 14: gosdn.networkelement.GetResponse + (*GetFlattenedRequest)(nil), // 15: gosdn.networkelement.GetFlattenedRequest + (*GetFlattenedResponse)(nil), // 16: gosdn.networkelement.GetFlattenedResponse + (*SetMne)(nil), // 17: gosdn.networkelement.SetMne + (*AddListRequest)(nil), // 18: gosdn.networkelement.AddListRequest + (*AddListResponse)(nil), // 19: gosdn.networkelement.AddListResponse + (*GetPathRequest)(nil), // 20: gosdn.networkelement.GetPathRequest + (*GetPathResponse)(nil), // 21: gosdn.networkelement.GetPathResponse + (*GetIntendedPathRequest)(nil), // 22: gosdn.networkelement.GetIntendedPathRequest + (*GetIntendedPathResponse)(nil), // 23: gosdn.networkelement.GetIntendedPathResponse + (*SetResponse)(nil), // 24: gosdn.networkelement.SetResponse + (*SetPathListRequest)(nil), // 25: gosdn.networkelement.SetPathListRequest + (*SetPathListResponse)(nil), // 26: gosdn.networkelement.SetPathListResponse + (*DeleteRequest)(nil), // 27: gosdn.networkelement.DeleteRequest + (*DeleteResponse)(nil), // 28: gosdn.networkelement.DeleteResponse + (*Change)(nil), // 29: gosdn.networkelement.Change + (*ChangeRequest)(nil), // 30: gosdn.networkelement.ChangeRequest + (*SetChange)(nil), // 31: gosdn.networkelement.SetChange + (*GetChangeListRequest)(nil), // 32: gosdn.networkelement.GetChangeListRequest + (*GetChangeListResponse)(nil), // 33: gosdn.networkelement.GetChangeListResponse + (*GetChangeRequest)(nil), // 34: gosdn.networkelement.GetChangeRequest + (*GetChangeResponse)(nil), // 35: gosdn.networkelement.GetChangeResponse + (*SetChangeListRequest)(nil), // 36: gosdn.networkelement.SetChangeListRequest + (*SetChangeListResponse)(nil), // 37: gosdn.networkelement.SetChangeListResponse + (*SubscriptionList)(nil), // 38: gosdn.networkelement.SubscriptionList + (*Subscription)(nil), // 39: gosdn.networkelement.Subscription + (*SubscribePathRequest)(nil), // 40: gosdn.networkelement.SubscribePathRequest + (*SubscribePathResponse)(nil), // 41: gosdn.networkelement.SubscribePathResponse + (*plugin_registry.Plugin)(nil), // 42: gosdn.plugin_registry.Plugin + (*gnmi.Notification)(nil), // 43: gnmi.Notification + (*transport.TransportOption)(nil), // 44: gosdn.transport.TransportOption + (*conflict.Metadata)(nil), // 45: gosdn.conflict.Metadata + (*pnd.PrincipalNetworkDomain)(nil), // 46: gosdn.pnd.PrincipalNetworkDomain + (*gnmi.Path)(nil), // 47: gnmi.Path + (*gnmi.TypedValue)(nil), // 48: gnmi.TypedValue } var file_gosdn_networkelement_networkelement_proto_depIdxs = []int32{ 7, // 0: gosdn.networkelement.UpdateNetworkElementRequest.network_element:type_name -> gosdn.networkelement.ManagedNetworkElement - 44, // 1: gosdn.networkelement.ManagedNetworkElement.plugin:type_name -> gosdn.plugin_registry.Plugin - 45, // 2: gosdn.networkelement.ManagedNetworkElement.mne_notification:type_name -> gnmi.Notification - 46, // 3: gosdn.networkelement.ManagedNetworkElement.transport_option:type_name -> gosdn.transport.TransportOption - 47, // 4: gosdn.networkelement.ManagedNetworkElement.metadata:type_name -> gosdn.conflict.Metadata - 48, // 5: gosdn.networkelement.GetAllResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 42, // 1: gosdn.networkelement.ManagedNetworkElement.plugin:type_name -> gosdn.plugin_registry.Plugin + 43, // 2: gosdn.networkelement.ManagedNetworkElement.mne_notification:type_name -> gnmi.Notification + 44, // 3: gosdn.networkelement.ManagedNetworkElement.transport_option:type_name -> gosdn.transport.TransportOption + 45, // 4: gosdn.networkelement.ManagedNetworkElement.metadata:type_name -> gosdn.conflict.Metadata + 46, // 5: gosdn.networkelement.GetAllResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 7, // 6: gosdn.networkelement.GetAllResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement - 48, // 7: gosdn.networkelement.GetAllFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 46, // 7: gosdn.networkelement.GetAllFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 8, // 8: gosdn.networkelement.GetAllFlattenedResponse.mne:type_name -> gosdn.networkelement.FlattenedManagedNetworkElement - 48, // 9: gosdn.networkelement.GetResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 46, // 9: gosdn.networkelement.GetResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 7, // 10: gosdn.networkelement.GetResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement - 48, // 11: gosdn.networkelement.GetFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 46, // 11: gosdn.networkelement.GetFlattenedResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain 8, // 12: gosdn.networkelement.GetFlattenedResponse.mne:type_name -> gosdn.networkelement.FlattenedManagedNetworkElement - 46, // 13: gosdn.networkelement.SetMne.transport_option:type_name -> gosdn.transport.TransportOption - 19, // 14: gosdn.networkelement.AddListRequest.mne:type_name -> gosdn.networkelement.SetMne - 26, // 15: gosdn.networkelement.AddListResponse.responses:type_name -> gosdn.networkelement.SetResponse - 48, // 16: gosdn.networkelement.GetPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 45, // 17: gosdn.networkelement.GetPathResponse.mne_notification:type_name -> gnmi.Notification - 48, // 18: gosdn.networkelement.GetIntendedPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 45, // 19: gosdn.networkelement.GetIntendedPathResponse.mne_notification:type_name -> gnmi.Notification - 32, // 20: gosdn.networkelement.SetPathListRequest.change_request:type_name -> gosdn.networkelement.ChangeRequest - 26, // 21: gosdn.networkelement.SetPathListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 44, // 13: gosdn.networkelement.SetMne.transport_option:type_name -> gosdn.transport.TransportOption + 17, // 14: gosdn.networkelement.AddListRequest.mne:type_name -> gosdn.networkelement.SetMne + 24, // 15: gosdn.networkelement.AddListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 46, // 16: gosdn.networkelement.GetPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 43, // 17: gosdn.networkelement.GetPathResponse.mne_notification:type_name -> gnmi.Notification + 46, // 18: gosdn.networkelement.GetIntendedPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 43, // 19: gosdn.networkelement.GetIntendedPathResponse.mne_notification:type_name -> gnmi.Notification + 30, // 20: gosdn.networkelement.SetPathListRequest.change_request:type_name -> gosdn.networkelement.ChangeRequest + 24, // 21: gosdn.networkelement.SetPathListResponse.responses:type_name -> gosdn.networkelement.SetResponse 0, // 22: gosdn.networkelement.Change.state:type_name -> gosdn.networkelement.ChangeState - 45, // 23: gosdn.networkelement.Change.diff:type_name -> gnmi.Notification - 49, // 24: gosdn.networkelement.ChangeRequest.path:type_name -> gnmi.Path - 50, // 25: gosdn.networkelement.ChangeRequest.value:type_name -> gnmi.TypedValue + 43, // 23: gosdn.networkelement.Change.diff:type_name -> gnmi.Notification + 47, // 24: gosdn.networkelement.ChangeRequest.path:type_name -> gnmi.Path + 48, // 25: gosdn.networkelement.ChangeRequest.value:type_name -> gnmi.TypedValue 1, // 26: gosdn.networkelement.ChangeRequest.api_op:type_name -> gosdn.networkelement.ApiOperation 2, // 27: gosdn.networkelement.SetChange.op:type_name -> gosdn.networkelement.Operation - 48, // 28: gosdn.networkelement.GetChangeListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 31, // 29: gosdn.networkelement.GetChangeListResponse.change:type_name -> gosdn.networkelement.Change - 48, // 30: gosdn.networkelement.GetChangeResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain - 31, // 31: gosdn.networkelement.GetChangeResponse.change:type_name -> gosdn.networkelement.Change - 33, // 32: gosdn.networkelement.SetChangeListRequest.change:type_name -> gosdn.networkelement.SetChange - 26, // 33: gosdn.networkelement.SetChangeListResponse.responses:type_name -> gosdn.networkelement.SetResponse - 41, // 34: gosdn.networkelement.SubscriptionList.subscription:type_name -> gosdn.networkelement.Subscription + 46, // 28: gosdn.networkelement.GetChangeListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 29, // 29: gosdn.networkelement.GetChangeListResponse.change:type_name -> gosdn.networkelement.Change + 46, // 30: gosdn.networkelement.GetChangeResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain + 29, // 31: gosdn.networkelement.GetChangeResponse.change:type_name -> gosdn.networkelement.Change + 31, // 32: gosdn.networkelement.SetChangeListRequest.change:type_name -> gosdn.networkelement.SetChange + 24, // 33: gosdn.networkelement.SetChangeListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 39, // 34: gosdn.networkelement.SubscriptionList.subscription:type_name -> gosdn.networkelement.Subscription 3, // 35: gosdn.networkelement.SubscriptionList.mode:type_name -> gosdn.networkelement.SubscriptionMode 4, // 36: gosdn.networkelement.Subscription.stream_mode:type_name -> gosdn.networkelement.StreamMode - 40, // 37: gosdn.networkelement.SubscribePathRequest.sublist:type_name -> gosdn.networkelement.SubscriptionList - 45, // 38: gosdn.networkelement.SubscribePathResponse.mne_notification:type_name -> gnmi.Notification + 38, // 37: gosdn.networkelement.SubscribePathRequest.sublist:type_name -> gosdn.networkelement.SubscriptionList + 43, // 38: gosdn.networkelement.SubscribePathResponse.mne_notification:type_name -> gnmi.Notification 5, // 39: gosdn.networkelement.NetworkElementService.Update:input_type -> gosdn.networkelement.UpdateNetworkElementRequest 9, // 40: gosdn.networkelement.NetworkElementService.GetAll:input_type -> gosdn.networkelement.GetAllRequest 11, // 41: gosdn.networkelement.NetworkElementService.GetAllFlattened:input_type -> gosdn.networkelement.GetAllFlattenedRequest - 15, // 42: gosdn.networkelement.NetworkElementService.Get:input_type -> gosdn.networkelement.GetRequest - 13, // 43: gosdn.networkelement.NetworkElementService.ParseYang:input_type -> gosdn.networkelement.ParseYangRequest - 17, // 44: gosdn.networkelement.NetworkElementService.GetFlattened:input_type -> gosdn.networkelement.GetFlattenedRequest - 20, // 45: gosdn.networkelement.NetworkElementService.AddList:input_type -> gosdn.networkelement.AddListRequest - 22, // 46: gosdn.networkelement.NetworkElementService.GetPath:input_type -> gosdn.networkelement.GetPathRequest - 24, // 47: gosdn.networkelement.NetworkElementService.GetIntendedPath:input_type -> gosdn.networkelement.GetIntendedPathRequest - 27, // 48: gosdn.networkelement.NetworkElementService.SetPathList:input_type -> gosdn.networkelement.SetPathListRequest - 29, // 49: gosdn.networkelement.NetworkElementService.Delete:input_type -> gosdn.networkelement.DeleteRequest - 34, // 50: gosdn.networkelement.NetworkElementService.GetChangeList:input_type -> gosdn.networkelement.GetChangeListRequest - 36, // 51: gosdn.networkelement.NetworkElementService.GetChange:input_type -> gosdn.networkelement.GetChangeRequest - 38, // 52: gosdn.networkelement.NetworkElementService.SetChangeList:input_type -> gosdn.networkelement.SetChangeListRequest - 42, // 53: gosdn.networkelement.NetworkElementService.SubscribePath:input_type -> gosdn.networkelement.SubscribePathRequest - 6, // 54: gosdn.networkelement.NetworkElementService.Update:output_type -> gosdn.networkelement.UpdateNetworkElementResponse - 10, // 55: gosdn.networkelement.NetworkElementService.GetAll:output_type -> gosdn.networkelement.GetAllResponse - 12, // 56: gosdn.networkelement.NetworkElementService.GetAllFlattened:output_type -> gosdn.networkelement.GetAllFlattenedResponse - 16, // 57: gosdn.networkelement.NetworkElementService.Get:output_type -> gosdn.networkelement.GetResponse - 14, // 58: gosdn.networkelement.NetworkElementService.ParseYang:output_type -> gosdn.networkelement.ParseYangResponse - 18, // 59: gosdn.networkelement.NetworkElementService.GetFlattened:output_type -> gosdn.networkelement.GetFlattenedResponse - 21, // 60: gosdn.networkelement.NetworkElementService.AddList:output_type -> gosdn.networkelement.AddListResponse - 23, // 61: gosdn.networkelement.NetworkElementService.GetPath:output_type -> gosdn.networkelement.GetPathResponse - 25, // 62: gosdn.networkelement.NetworkElementService.GetIntendedPath:output_type -> gosdn.networkelement.GetIntendedPathResponse - 28, // 63: gosdn.networkelement.NetworkElementService.SetPathList:output_type -> gosdn.networkelement.SetPathListResponse - 30, // 64: gosdn.networkelement.NetworkElementService.Delete:output_type -> gosdn.networkelement.DeleteResponse - 35, // 65: gosdn.networkelement.NetworkElementService.GetChangeList:output_type -> gosdn.networkelement.GetChangeListResponse - 37, // 66: gosdn.networkelement.NetworkElementService.GetChange:output_type -> gosdn.networkelement.GetChangeResponse - 39, // 67: gosdn.networkelement.NetworkElementService.SetChangeList:output_type -> gosdn.networkelement.SetChangeListResponse - 43, // 68: gosdn.networkelement.NetworkElementService.SubscribePath:output_type -> gosdn.networkelement.SubscribePathResponse - 54, // [54:69] is the sub-list for method output_type - 39, // [39:54] is the sub-list for method input_type + 13, // 42: gosdn.networkelement.NetworkElementService.Get:input_type -> gosdn.networkelement.GetRequest + 15, // 43: gosdn.networkelement.NetworkElementService.GetFlattened:input_type -> gosdn.networkelement.GetFlattenedRequest + 18, // 44: gosdn.networkelement.NetworkElementService.AddList:input_type -> gosdn.networkelement.AddListRequest + 20, // 45: gosdn.networkelement.NetworkElementService.GetPath:input_type -> gosdn.networkelement.GetPathRequest + 22, // 46: gosdn.networkelement.NetworkElementService.GetIntendedPath:input_type -> gosdn.networkelement.GetIntendedPathRequest + 25, // 47: gosdn.networkelement.NetworkElementService.SetPathList:input_type -> gosdn.networkelement.SetPathListRequest + 27, // 48: gosdn.networkelement.NetworkElementService.Delete:input_type -> gosdn.networkelement.DeleteRequest + 32, // 49: gosdn.networkelement.NetworkElementService.GetChangeList:input_type -> gosdn.networkelement.GetChangeListRequest + 34, // 50: gosdn.networkelement.NetworkElementService.GetChange:input_type -> gosdn.networkelement.GetChangeRequest + 36, // 51: gosdn.networkelement.NetworkElementService.SetChangeList:input_type -> gosdn.networkelement.SetChangeListRequest + 40, // 52: gosdn.networkelement.NetworkElementService.SubscribePath:input_type -> gosdn.networkelement.SubscribePathRequest + 6, // 53: gosdn.networkelement.NetworkElementService.Update:output_type -> gosdn.networkelement.UpdateNetworkElementResponse + 10, // 54: gosdn.networkelement.NetworkElementService.GetAll:output_type -> gosdn.networkelement.GetAllResponse + 12, // 55: gosdn.networkelement.NetworkElementService.GetAllFlattened:output_type -> gosdn.networkelement.GetAllFlattenedResponse + 14, // 56: gosdn.networkelement.NetworkElementService.Get:output_type -> gosdn.networkelement.GetResponse + 16, // 57: gosdn.networkelement.NetworkElementService.GetFlattened:output_type -> gosdn.networkelement.GetFlattenedResponse + 19, // 58: gosdn.networkelement.NetworkElementService.AddList:output_type -> gosdn.networkelement.AddListResponse + 21, // 59: gosdn.networkelement.NetworkElementService.GetPath:output_type -> gosdn.networkelement.GetPathResponse + 23, // 60: gosdn.networkelement.NetworkElementService.GetIntendedPath:output_type -> gosdn.networkelement.GetIntendedPathResponse + 26, // 61: gosdn.networkelement.NetworkElementService.SetPathList:output_type -> gosdn.networkelement.SetPathListResponse + 28, // 62: gosdn.networkelement.NetworkElementService.Delete:output_type -> gosdn.networkelement.DeleteResponse + 33, // 63: gosdn.networkelement.NetworkElementService.GetChangeList:output_type -> gosdn.networkelement.GetChangeListResponse + 35, // 64: gosdn.networkelement.NetworkElementService.GetChange:output_type -> gosdn.networkelement.GetChangeResponse + 37, // 65: gosdn.networkelement.NetworkElementService.SetChangeList:output_type -> gosdn.networkelement.SetChangeListResponse + 41, // 66: gosdn.networkelement.NetworkElementService.SubscribePath:output_type -> gosdn.networkelement.SubscribePathResponse + 53, // [53:67] is the sub-list for method output_type + 39, // [39:53] is the sub-list for method input_type 39, // [39:39] is the sub-list for extension type_name 39, // [39:39] is the sub-list for extension extendee 0, // [0:39] is the sub-list for field type_name @@ -3331,7 +3206,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_networkelement_networkelement_proto_rawDesc), len(file_gosdn_networkelement_networkelement_proto_rawDesc)), NumEnums: 5, - NumMessages: 39, + NumMessages: 37, NumExtensions: 0, NumServices: 1, }, diff --git a/api/go/gosdn/networkelement/networkelement.pb.gw.go b/api/go/gosdn/networkelement/networkelement.pb.gw.go index 1671997bf..ff792ae8e 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.gw.go +++ b/api/go/gosdn/networkelement/networkelement.pb.gw.go @@ -143,39 +143,6 @@ func local_request_NetworkElementService_Get_0(ctx context.Context, marshaler ru return msg, metadata, err } -var filter_NetworkElementService_ParseYang_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} - -func request_NetworkElementService_ParseYang_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq ParseYangRequest - metadata runtime.ServerMetadata - ) - io.Copy(io.Discard, req.Body) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_ParseYang_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.ParseYang(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err -} - -func local_request_NetworkElementService_ParseYang_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq ParseYangRequest - metadata runtime.ServerMetadata - ) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_ParseYang_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.ParseYang(ctx, &protoReq) - return msg, metadata, err -} - func request_NetworkElementService_AddList_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq AddListRequest @@ -583,26 +550,6 @@ func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtim } forward_NetworkElementService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodGet, pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_NetworkElementService_ParseYang_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_NetworkElementService_ParseYang_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle(http.MethodPost, pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -854,23 +801,6 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim } forward_NetworkElementService_Get_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodGet, pattern_NetworkElementService_ParseYang_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/ParseYang", runtime.WithHTTPPathPattern("/yang/parse")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_NetworkElementService_ParseYang_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_NetworkElementService_ParseYang_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) mux.Handle(http.MethodPost, pattern_NetworkElementService_AddList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1014,7 +944,6 @@ var ( pattern_NetworkElementService_Update_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"network-element", "update"}, "")) pattern_NetworkElementService_GetAllFlattened_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"mnes"}, "")) pattern_NetworkElementService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"mnes", "mneid"}, "")) - pattern_NetworkElementService_ParseYang_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"yang", "parse"}, "")) pattern_NetworkElementService_AddList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"mnes"}, "")) pattern_NetworkElementService_GetPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"mnes", "mneid", "paths", "path"}, "")) pattern_NetworkElementService_GetIntendedPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"mnes", "mneid", "intendedpaths", "intended_path"}, "")) @@ -1029,7 +958,6 @@ var ( forward_NetworkElementService_Update_0 = runtime.ForwardResponseMessage forward_NetworkElementService_GetAllFlattened_0 = runtime.ForwardResponseMessage forward_NetworkElementService_Get_0 = runtime.ForwardResponseMessage - forward_NetworkElementService_ParseYang_0 = runtime.ForwardResponseMessage forward_NetworkElementService_AddList_0 = runtime.ForwardResponseMessage forward_NetworkElementService_GetPath_0 = runtime.ForwardResponseMessage forward_NetworkElementService_GetIntendedPath_0 = runtime.ForwardResponseMessage diff --git a/api/go/gosdn/networkelement/networkelement_grpc.pb.go b/api/go/gosdn/networkelement/networkelement_grpc.pb.go index 5bd523242..bab93548d 100644 --- a/api/go/gosdn/networkelement/networkelement_grpc.pb.go +++ b/api/go/gosdn/networkelement/networkelement_grpc.pb.go @@ -23,7 +23,6 @@ const ( NetworkElementService_GetAll_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetAll" NetworkElementService_GetAllFlattened_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetAllFlattened" NetworkElementService_Get_FullMethodName = "/gosdn.networkelement.NetworkElementService/Get" - NetworkElementService_ParseYang_FullMethodName = "/gosdn.networkelement.NetworkElementService/ParseYang" NetworkElementService_GetFlattened_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetFlattened" NetworkElementService_AddList_FullMethodName = "/gosdn.networkelement.NetworkElementService/AddList" NetworkElementService_GetPath_FullMethodName = "/gosdn.networkelement.NetworkElementService/GetPath" @@ -57,9 +56,6 @@ type NetworkElementServiceClient interface { // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) - // Allows to request a specific Managed Network Element which is managed by a - // specific Principal Network Domain. - ParseYang(ctx context.Context, in *ParseYangRequest, opts ...grpc.CallOption) (*ParseYangResponse, error) // TODO: add http option // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. A flattened version of a Managed @@ -144,16 +140,6 @@ func (c *networkElementServiceClient) Get(ctx context.Context, in *GetRequest, o return out, nil } -func (c *networkElementServiceClient) ParseYang(ctx context.Context, in *ParseYangRequest, opts ...grpc.CallOption) (*ParseYangResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(ParseYangResponse) - err := c.cc.Invoke(ctx, NetworkElementService_ParseYang_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *networkElementServiceClient) GetFlattened(ctx context.Context, in *GetFlattenedRequest, opts ...grpc.CallOption) (*GetFlattenedResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetFlattenedResponse) @@ -284,9 +270,6 @@ type NetworkElementServiceServer interface { // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. Get(context.Context, *GetRequest) (*GetResponse, error) - // Allows to request a specific Managed Network Element which is managed by a - // specific Principal Network Domain. - ParseYang(context.Context, *ParseYangRequest) (*ParseYangResponse, error) // TODO: add http option // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. A flattened version of a Managed @@ -343,9 +326,6 @@ func (UnimplementedNetworkElementServiceServer) GetAllFlattened(context.Context, func (UnimplementedNetworkElementServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") } -func (UnimplementedNetworkElementServiceServer) ParseYang(context.Context, *ParseYangRequest) (*ParseYangResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ParseYang not implemented") -} func (UnimplementedNetworkElementServiceServer) GetFlattened(context.Context, *GetFlattenedRequest) (*GetFlattenedResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFlattened not implemented") } @@ -469,24 +449,6 @@ func _NetworkElementService_Get_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } -func _NetworkElementService_ParseYang_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ParseYangRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NetworkElementServiceServer).ParseYang(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: NetworkElementService_ParseYang_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NetworkElementServiceServer).ParseYang(ctx, req.(*ParseYangRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _NetworkElementService_GetFlattened_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetFlattenedRequest) if err := dec(in); err != nil { @@ -683,10 +645,6 @@ var NetworkElementService_ServiceDesc = grpc.ServiceDesc{ MethodName: "Get", Handler: _NetworkElementService_Get_Handler, }, - { - MethodName: "ParseYang", - Handler: _NetworkElementService_ParseYang_Handler, - }, { MethodName: "GetFlattened", Handler: _NetworkElementService_GetFlattened_Handler, diff --git a/api/openapiv2/gosdn_northbound.swagger.json b/api/openapiv2/gosdn_northbound.swagger.json index d5a7d045d..f80bce3cc 100644 --- a/api/openapiv2/gosdn_northbound.swagger.json +++ b/api/openapiv2/gosdn_northbound.swagger.json @@ -1735,45 +1735,6 @@ "UserService" ] } - }, - "/yang/parse": { - "get": { - "summary": "Allows to request a specific Managed Network Element which is managed by a\nspecific Principal Network Domain.", - "operationId": "NetworkElementService_ParseYang", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/networkelementParseYangResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/googlerpcStatus" - } - } - }, - "parameters": [ - { - "name": "timestamp", - "description": "Timestamp in nanoseconds since Epoch.", - "in": "query", - "required": false, - "type": "string", - "format": "int64" - }, - { - "name": "yang", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "NetworkElementService" - ] - } } }, "definitions": { @@ -3632,19 +3593,6 @@ } } }, - "networkelementParseYangResponse": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "int64", - "description": "Timestamp in nanoseconds since Epoch." - }, - "json": { - "type": "string" - } - } - }, "networkelementSetChange": { "type": "object", "properties": { diff --git a/api/proto/gosdn/networkelement/networkelement.proto b/api/proto/gosdn/networkelement/networkelement.proto index e893c00f2..34b4ec2ad 100644 --- a/api/proto/gosdn/networkelement/networkelement.proto +++ b/api/proto/gosdn/networkelement/networkelement.proto @@ -45,12 +45,6 @@ service NetworkElementService { } - // Allows to request a specific Managed Network Element which is managed by a - // specific Principal Network Domain. - rpc ParseYang(ParseYangRequest) returns (ParseYangResponse) { - option (google.api.http) = {get: "/yang/parse"}; - } - // TODO: add http option // Allows to request a specific Managed Network Element which is managed by a // specific Principal Network Domain. A flattened version of a Managed @@ -177,18 +171,6 @@ message GetAllFlattenedResponse { repeated FlattenedManagedNetworkElement mne = 3; } -message ParseYangRequest { - int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. - string yang = 2 [(buf.validate.field).required = true]; -} - - -message ParseYangResponse { - int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. - string json = 2 [(buf.validate.field).required = true]; -} - - message GetRequest { int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. string mneid = 2 [(buf.validate.field).required = true]; diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go index 08bcf2a0e..4a3db1c4f 100644 --- a/controller/northbound/server/networkElement.go +++ b/controller/northbound/server/networkElement.go @@ -23,7 +23,6 @@ import ( util "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/gnmi" "code.fbi.h-da.de/danet/gosdn/controller/store" aGNMI "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" - "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "github.com/bufbuild/protovalidate-go" "github.com/google/uuid" "github.com/hashicorp/go-multierror" @@ -183,37 +182,6 @@ func (n *NetworkElementServer) GetFlattened(ctx context.Context, request *mnepb. }, nil } -func (n *NetworkElementServer) ParseYang(ctx context.Context, request *mnepb.ParseYangRequest) (*mnepb.ParseYangResponse, error) { - if err := n.protoValidator.Validate(request); err != nil { - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - device := &openconfig.Device{} - - if err := openconfig.Unmarshal([]byte(request.Yang), device); err != nil { - log.Error(err) - return nil, err - } - - json, err := ygot.EmitJSON(device, &ygot.EmitJSONConfig{ - Format: ygot.RFC7951, - Indent: " ", - RFC7951Config: &ygot.RFC7951JSONConfig{ - AppendModuleName: true, - }, - }) - - if err != nil { - log.Error(err) - return nil, err - } - - return &mnepb.ParseYangResponse{ - Timestamp: time.Now().UnixNano(), - Json: string(json), - }, nil -} - func (n *NetworkElementServer) getMne(identifier string) (networkelement.NetworkElement, error) { id, err := uuid.Parse(identifier) if err != nil { -- GitLab From e8b5855d5f05bc14e1f4f46f7e02bc7d4b96d5d9 Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 6 Mar 2025 13:37:13 +0100 Subject: [PATCH 77/78] remove getavailableplugins endpoint --- .../plugin-registry/plugin-registry.pb.go | 257 +++++------------- api/go/gosdn/plugin/plugin.pb.go | 250 +++++++---------- api/go/gosdn/plugin/plugin.pb.gw.go | 162 ----------- api/go/gosdn/plugin/plugin_grpc.pb.go | 57 +--- .../plugin-registry/plugin-registry.proto | 10 - api/proto/gosdn/plugin/plugin.proto | 5 - controller/controller.go | 2 - controller/http.go | 6 - .../devices/routines/plugin.routine.ts | 6 +- react-ui/src/shared/api/api.ts | 38 +-- 10 files changed, 186 insertions(+), 607 deletions(-) delete mode 100644 api/go/gosdn/plugin/plugin.pb.gw.go diff --git a/api/go/gosdn/plugin-registry/plugin-registry.pb.go b/api/go/gosdn/plugin-registry/plugin-registry.pb.go index 66ded0daf..abedd4ee0 100644 --- a/api/go/gosdn/plugin-registry/plugin-registry.pb.go +++ b/api/go/gosdn/plugin-registry/plugin-registry.pb.go @@ -8,7 +8,6 @@ package plugin_registry import ( _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" - _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" _ "google.golang.org/protobuf/types/known/timestamppb" @@ -566,102 +565,6 @@ func (x *Manifest) GetVersion() string { return "" } -type GetAvailablePluginsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Plugins []*Plugin `protobuf:"bytes,2,rep,name=plugins,proto3" json:"plugins,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetAvailablePluginsResponse) Reset() { - *x = GetAvailablePluginsResponse{} - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetAvailablePluginsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAvailablePluginsResponse) ProtoMessage() {} - -func (x *GetAvailablePluginsResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[10] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAvailablePluginsResponse.ProtoReflect.Descriptor instead. -func (*GetAvailablePluginsResponse) Descriptor() ([]byte, []int) { - return file_gosdn_plugin_registry_plugin_registry_proto_rawDescGZIP(), []int{10} -} - -func (x *GetAvailablePluginsResponse) GetTimestamp() int64 { - if x != nil { - return x.Timestamp - } - return 0 -} - -func (x *GetAvailablePluginsResponse) GetPlugins() []*Plugin { - if x != nil { - return x.Plugins - } - return nil -} - -type GetAvailablePluginsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetAvailablePluginsRequest) Reset() { - *x = GetAvailablePluginsRequest{} - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetAvailablePluginsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAvailablePluginsRequest) ProtoMessage() {} - -func (x *GetAvailablePluginsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_plugin_registry_plugin_registry_proto_msgTypes[11] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAvailablePluginsRequest.ProtoReflect.Descriptor instead. -func (*GetAvailablePluginsRequest) Descriptor() ([]byte, []int) { - return file_gosdn_plugin_registry_plugin_registry_proto_rawDescGZIP(), []int{11} -} - -func (x *GetAvailablePluginsRequest) GetTimestamp() int64 { - if x != nil { - return x.Timestamp - } - return 0 -} - var File_gosdn_plugin_registry_plugin_registry_proto protoreflect.FileDescriptor var file_gosdn_plugin_registry_plugin_registry_proto_rawDesc = string([]byte{ @@ -673,68 +576,55 @@ var file_gosdn_plugin_registry_plugin_registry_proto_rawDesc = string([]byte{ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3a, 0x0a, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4d, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x4a, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, - 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2a, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, - 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, 0x06, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, - 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, - 0x73, 0x74, 0x22, 0x6c, 0x0a, 0x08, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x74, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, - 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3a, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x06, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2d, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4d, 0x0a, 0x05, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, + 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0x4a, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x32, 0xf4, 0x02, 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x67, + 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, + 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2a, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2e, 0x0a, + 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, + 0x06, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, + 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, + 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x2e, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x22, 0x6c, 0x0a, 0x08, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x32, 0xf4, 0x02, 0x0a, 0x15, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, @@ -776,39 +666,36 @@ func file_gosdn_plugin_registry_plugin_registry_proto_rawDescGZIP() []byte { return file_gosdn_plugin_registry_plugin_registry_proto_rawDescData } -var file_gosdn_plugin_registry_plugin_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_gosdn_plugin_registry_plugin_registry_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_gosdn_plugin_registry_plugin_registry_proto_goTypes = []any{ - (*GetRequest)(nil), // 0: gosdn.plugin_registry.GetRequest - (*GetAllRequest)(nil), // 1: gosdn.plugin_registry.GetAllRequest - (*Query)(nil), // 2: gosdn.plugin_registry.Query - (*GetResponse)(nil), // 3: gosdn.plugin_registry.GetResponse - (*GetDownloadRequest)(nil), // 4: gosdn.plugin_registry.GetDownloadRequest - (*GetDownloadPayload)(nil), // 5: gosdn.plugin_registry.GetDownloadPayload - (*DeleteRequest)(nil), // 6: gosdn.plugin_registry.DeleteRequest - (*DeleteResponse)(nil), // 7: gosdn.plugin_registry.DeleteResponse - (*Plugin)(nil), // 8: gosdn.plugin_registry.Plugin - (*Manifest)(nil), // 9: gosdn.plugin_registry.Manifest - (*GetAvailablePluginsResponse)(nil), // 10: gosdn.plugin_registry.GetAvailablePluginsResponse - (*GetAvailablePluginsRequest)(nil), // 11: gosdn.plugin_registry.GetAvailablePluginsRequest + (*GetRequest)(nil), // 0: gosdn.plugin_registry.GetRequest + (*GetAllRequest)(nil), // 1: gosdn.plugin_registry.GetAllRequest + (*Query)(nil), // 2: gosdn.plugin_registry.Query + (*GetResponse)(nil), // 3: gosdn.plugin_registry.GetResponse + (*GetDownloadRequest)(nil), // 4: gosdn.plugin_registry.GetDownloadRequest + (*GetDownloadPayload)(nil), // 5: gosdn.plugin_registry.GetDownloadPayload + (*DeleteRequest)(nil), // 6: gosdn.plugin_registry.DeleteRequest + (*DeleteResponse)(nil), // 7: gosdn.plugin_registry.DeleteResponse + (*Plugin)(nil), // 8: gosdn.plugin_registry.Plugin + (*Manifest)(nil), // 9: gosdn.plugin_registry.Manifest } var file_gosdn_plugin_registry_plugin_registry_proto_depIdxs = []int32{ 2, // 0: gosdn.plugin_registry.GetRequest.query:type_name -> gosdn.plugin_registry.Query 8, // 1: gosdn.plugin_registry.GetResponse.plugins:type_name -> gosdn.plugin_registry.Plugin 9, // 2: gosdn.plugin_registry.Plugin.manifest:type_name -> gosdn.plugin_registry.Manifest - 8, // 3: gosdn.plugin_registry.GetAvailablePluginsResponse.plugins:type_name -> gosdn.plugin_registry.Plugin - 0, // 4: gosdn.plugin_registry.PluginRegistryService.Get:input_type -> gosdn.plugin_registry.GetRequest - 1, // 5: gosdn.plugin_registry.PluginRegistryService.GetAll:input_type -> gosdn.plugin_registry.GetAllRequest - 4, // 6: gosdn.plugin_registry.PluginRegistryService.Download:input_type -> gosdn.plugin_registry.GetDownloadRequest - 6, // 7: gosdn.plugin_registry.PluginRegistryService.Delete:input_type -> gosdn.plugin_registry.DeleteRequest - 3, // 8: gosdn.plugin_registry.PluginRegistryService.Get:output_type -> gosdn.plugin_registry.GetResponse - 3, // 9: gosdn.plugin_registry.PluginRegistryService.GetAll:output_type -> gosdn.plugin_registry.GetResponse - 5, // 10: gosdn.plugin_registry.PluginRegistryService.Download:output_type -> gosdn.plugin_registry.GetDownloadPayload - 7, // 11: gosdn.plugin_registry.PluginRegistryService.Delete:output_type -> gosdn.plugin_registry.DeleteResponse - 8, // [8:12] is the sub-list for method output_type - 4, // [4:8] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 0, // 3: gosdn.plugin_registry.PluginRegistryService.Get:input_type -> gosdn.plugin_registry.GetRequest + 1, // 4: gosdn.plugin_registry.PluginRegistryService.GetAll:input_type -> gosdn.plugin_registry.GetAllRequest + 4, // 5: gosdn.plugin_registry.PluginRegistryService.Download:input_type -> gosdn.plugin_registry.GetDownloadRequest + 6, // 6: gosdn.plugin_registry.PluginRegistryService.Delete:input_type -> gosdn.plugin_registry.DeleteRequest + 3, // 7: gosdn.plugin_registry.PluginRegistryService.Get:output_type -> gosdn.plugin_registry.GetResponse + 3, // 8: gosdn.plugin_registry.PluginRegistryService.GetAll:output_type -> gosdn.plugin_registry.GetResponse + 5, // 9: gosdn.plugin_registry.PluginRegistryService.Download:output_type -> gosdn.plugin_registry.GetDownloadPayload + 7, // 10: gosdn.plugin_registry.PluginRegistryService.Delete:output_type -> gosdn.plugin_registry.DeleteResponse + 7, // [7:11] is the sub-list for method output_type + 3, // [3:7] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_gosdn_plugin_registry_plugin_registry_proto_init() } @@ -826,7 +713,7 @@ func file_gosdn_plugin_registry_plugin_registry_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_plugin_registry_plugin_registry_proto_rawDesc), len(file_gosdn_plugin_registry_plugin_registry_proto_rawDesc)), NumEnums: 0, - NumMessages: 12, + NumMessages: 10, NumExtensions: 0, NumServices: 1, }, diff --git a/api/go/gosdn/plugin/plugin.pb.go b/api/go/gosdn/plugin/plugin.pb.go index 9f4ca7edd..57f3307c3 100644 --- a/api/go/gosdn/plugin/plugin.pb.go +++ b/api/go/gosdn/plugin/plugin.pb.go @@ -9,7 +9,7 @@ package plugin import ( _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" networkelement "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" - plugin_registry "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry" + _ "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry" gnmi "github.com/openconfig/gnmi/proto/gnmi" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -866,50 +866,6 @@ func (x *Payload) GetChunk() []byte { return nil } -type GetAvailablePluginsRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetAvailablePluginsRequest) Reset() { - *x = GetAvailablePluginsRequest{} - mi := &file_gosdn_plugin_plugin_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GetAvailablePluginsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetAvailablePluginsRequest) ProtoMessage() {} - -func (x *GetAvailablePluginsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_plugin_plugin_proto_msgTypes[18] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetAvailablePluginsRequest.ProtoReflect.Descriptor instead. -func (*GetAvailablePluginsRequest) Descriptor() ([]byte, []int) { - return file_gosdn_plugin_plugin_proto_rawDescGZIP(), []int{18} -} - -func (x *GetAvailablePluginsRequest) GetTimestamp() int64 { - if x != nil { - return x.Timestamp - } - return 0 -} - var File_gosdn_plugin_plugin_proto protoreflect.FileDescriptor var file_gosdn_plugin_plugin_proto_rawDesc = string([]byte{ @@ -1007,65 +963,55 @@ var file_gosdn_plugin_plugin_proto_rawDesc = string([]byte{ 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1f, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, - 0xad, 0x06, 0x0a, 0x06, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x4c, 0x0a, 0x09, 0x55, 0x6e, - 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x46, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x05, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x44, - 0x69, 0x66, 0x66, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, - 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x12, 0x23, 0x2e, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x2e, 0x67, - 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x50, 0x72, 0x75, 0x6e, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x25, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x32, 0x5a, 0x30, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, - 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x6b, 0x32, 0xc8, 0x05, 0x0a, 0x06, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x4c, + 0x0a, 0x09, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, + 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, + 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, + 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0a, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, + 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3d, 0x0a, 0x04, 0x44, 0x69, 0x66, 0x66, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, + 0x0a, 0x0e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, + 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x12, 0x5b, + 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x50, + 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x12, + 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, + 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x32, + 0x5a, 0x30, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, + 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) var ( @@ -1080,45 +1026,43 @@ func file_gosdn_plugin_plugin_proto_rawDescGZIP() []byte { return file_gosdn_plugin_plugin_proto_rawDescData } -var file_gosdn_plugin_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 19) +var file_gosdn_plugin_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_gosdn_plugin_plugin_proto_goTypes = []any{ - (*UnmarshalRequest)(nil), // 0: gosdn.plugin.UnmarshalRequest - (*UnmarshalResponse)(nil), // 1: gosdn.plugin.UnmarshalResponse - (*SetNodeRequest)(nil), // 2: gosdn.plugin.SetNodeRequest - (*SetNodeResponse)(nil), // 3: gosdn.plugin.SetNodeResponse - (*GetNodeRequest)(nil), // 4: gosdn.plugin.GetNodeRequest - (*GetNodeResponse)(nil), // 5: gosdn.plugin.GetNodeResponse - (*DeleteNodeRequest)(nil), // 6: gosdn.plugin.DeleteNodeRequest - (*DeleteNodeResponse)(nil), // 7: gosdn.plugin.DeleteNodeResponse - (*ModelRequest)(nil), // 8: gosdn.plugin.ModelRequest - (*ModelResponse)(nil), // 9: gosdn.plugin.ModelResponse - (*DiffRequest)(nil), // 10: gosdn.plugin.DiffRequest - (*DiffResponse)(nil), // 11: gosdn.plugin.DiffResponse - (*ValidateChangeRequest)(nil), // 12: gosdn.plugin.ValidateChangeRequest - (*ValidateChangeResponse)(nil), // 13: gosdn.plugin.ValidateChangeResponse - (*PruneConfigFalseRequest)(nil), // 14: gosdn.plugin.PruneConfigFalseRequest - (*PruneConfigFalseResponse)(nil), // 15: gosdn.plugin.PruneConfigFalseResponse - (*SchemaTreeGzipRequest)(nil), // 16: gosdn.plugin.SchemaTreeGzipRequest - (*Payload)(nil), // 17: gosdn.plugin.Payload - (*GetAvailablePluginsRequest)(nil), // 18: gosdn.plugin.GetAvailablePluginsRequest - (*gnmi.Path)(nil), // 19: gnmi.Path - (*gnmi.TypedValue)(nil), // 20: gnmi.TypedValue - (*gnmi.Notification)(nil), // 21: gnmi.Notification - (networkelement.ApiOperation)(0), // 22: gosdn.networkelement.ApiOperation - (*plugin_registry.GetResponse)(nil), // 23: gosdn.plugin_registry.GetResponse + (*UnmarshalRequest)(nil), // 0: gosdn.plugin.UnmarshalRequest + (*UnmarshalResponse)(nil), // 1: gosdn.plugin.UnmarshalResponse + (*SetNodeRequest)(nil), // 2: gosdn.plugin.SetNodeRequest + (*SetNodeResponse)(nil), // 3: gosdn.plugin.SetNodeResponse + (*GetNodeRequest)(nil), // 4: gosdn.plugin.GetNodeRequest + (*GetNodeResponse)(nil), // 5: gosdn.plugin.GetNodeResponse + (*DeleteNodeRequest)(nil), // 6: gosdn.plugin.DeleteNodeRequest + (*DeleteNodeResponse)(nil), // 7: gosdn.plugin.DeleteNodeResponse + (*ModelRequest)(nil), // 8: gosdn.plugin.ModelRequest + (*ModelResponse)(nil), // 9: gosdn.plugin.ModelResponse + (*DiffRequest)(nil), // 10: gosdn.plugin.DiffRequest + (*DiffResponse)(nil), // 11: gosdn.plugin.DiffResponse + (*ValidateChangeRequest)(nil), // 12: gosdn.plugin.ValidateChangeRequest + (*ValidateChangeResponse)(nil), // 13: gosdn.plugin.ValidateChangeResponse + (*PruneConfigFalseRequest)(nil), // 14: gosdn.plugin.PruneConfigFalseRequest + (*PruneConfigFalseResponse)(nil), // 15: gosdn.plugin.PruneConfigFalseResponse + (*SchemaTreeGzipRequest)(nil), // 16: gosdn.plugin.SchemaTreeGzipRequest + (*Payload)(nil), // 17: gosdn.plugin.Payload + (*gnmi.Path)(nil), // 18: gnmi.Path + (*gnmi.TypedValue)(nil), // 19: gnmi.TypedValue + (*gnmi.Notification)(nil), // 20: gnmi.Notification + (networkelement.ApiOperation)(0), // 21: gosdn.networkelement.ApiOperation } var file_gosdn_plugin_plugin_proto_depIdxs = []int32{ - 19, // 0: gosdn.plugin.UnmarshalRequest.path:type_name -> gnmi.Path - 20, // 1: gosdn.plugin.UnmarshalRequest.value:type_name -> gnmi.TypedValue - 19, // 2: gosdn.plugin.SetNodeRequest.path:type_name -> gnmi.Path - 20, // 3: gosdn.plugin.SetNodeRequest.value:type_name -> gnmi.TypedValue - 19, // 4: gosdn.plugin.GetNodeRequest.path:type_name -> gnmi.Path - 21, // 5: gosdn.plugin.GetNodeResponse.nodes:type_name -> gnmi.Notification - 19, // 6: gosdn.plugin.DeleteNodeRequest.path:type_name -> gnmi.Path - 21, // 7: gosdn.plugin.DiffResponse.notification:type_name -> gnmi.Notification - 22, // 8: gosdn.plugin.ValidateChangeRequest.operation:type_name -> gosdn.networkelement.ApiOperation - 19, // 9: gosdn.plugin.ValidateChangeRequest.path:type_name -> gnmi.Path - 20, // 10: gosdn.plugin.ValidateChangeRequest.value:type_name -> gnmi.TypedValue + 18, // 0: gosdn.plugin.UnmarshalRequest.path:type_name -> gnmi.Path + 19, // 1: gosdn.plugin.UnmarshalRequest.value:type_name -> gnmi.TypedValue + 18, // 2: gosdn.plugin.SetNodeRequest.path:type_name -> gnmi.Path + 19, // 3: gosdn.plugin.SetNodeRequest.value:type_name -> gnmi.TypedValue + 18, // 4: gosdn.plugin.GetNodeRequest.path:type_name -> gnmi.Path + 20, // 5: gosdn.plugin.GetNodeResponse.nodes:type_name -> gnmi.Notification + 18, // 6: gosdn.plugin.DeleteNodeRequest.path:type_name -> gnmi.Path + 20, // 7: gosdn.plugin.DiffResponse.notification:type_name -> gnmi.Notification + 21, // 8: gosdn.plugin.ValidateChangeRequest.operation:type_name -> gosdn.networkelement.ApiOperation + 18, // 9: gosdn.plugin.ValidateChangeRequest.path:type_name -> gnmi.Path + 19, // 10: gosdn.plugin.ValidateChangeRequest.value:type_name -> gnmi.TypedValue 0, // 11: gosdn.plugin.Plugin.Unmarshal:input_type -> gosdn.plugin.UnmarshalRequest 2, // 12: gosdn.plugin.Plugin.SetNode:input_type -> gosdn.plugin.SetNodeRequest 4, // 13: gosdn.plugin.Plugin.GetNode:input_type -> gosdn.plugin.GetNodeRequest @@ -1128,19 +1072,17 @@ var file_gosdn_plugin_plugin_proto_depIdxs = []int32{ 16, // 17: gosdn.plugin.Plugin.SchemaTreeGzip:input_type -> gosdn.plugin.SchemaTreeGzipRequest 12, // 18: gosdn.plugin.Plugin.ValidateChange:input_type -> gosdn.plugin.ValidateChangeRequest 14, // 19: gosdn.plugin.Plugin.PruneConfigFalse:input_type -> gosdn.plugin.PruneConfigFalseRequest - 18, // 20: gosdn.plugin.Plugin.GetAvailablePlugins:input_type -> gosdn.plugin.GetAvailablePluginsRequest - 1, // 21: gosdn.plugin.Plugin.Unmarshal:output_type -> gosdn.plugin.UnmarshalResponse - 3, // 22: gosdn.plugin.Plugin.SetNode:output_type -> gosdn.plugin.SetNodeResponse - 5, // 23: gosdn.plugin.Plugin.GetNode:output_type -> gosdn.plugin.GetNodeResponse - 7, // 24: gosdn.plugin.Plugin.DeleteNode:output_type -> gosdn.plugin.DeleteNodeResponse - 9, // 25: gosdn.plugin.Plugin.Model:output_type -> gosdn.plugin.ModelResponse - 11, // 26: gosdn.plugin.Plugin.Diff:output_type -> gosdn.plugin.DiffResponse - 17, // 27: gosdn.plugin.Plugin.SchemaTreeGzip:output_type -> gosdn.plugin.Payload - 13, // 28: gosdn.plugin.Plugin.ValidateChange:output_type -> gosdn.plugin.ValidateChangeResponse - 15, // 29: gosdn.plugin.Plugin.PruneConfigFalse:output_type -> gosdn.plugin.PruneConfigFalseResponse - 23, // 30: gosdn.plugin.Plugin.GetAvailablePlugins:output_type -> gosdn.plugin_registry.GetResponse - 21, // [21:31] is the sub-list for method output_type - 11, // [11:21] is the sub-list for method input_type + 1, // 20: gosdn.plugin.Plugin.Unmarshal:output_type -> gosdn.plugin.UnmarshalResponse + 3, // 21: gosdn.plugin.Plugin.SetNode:output_type -> gosdn.plugin.SetNodeResponse + 5, // 22: gosdn.plugin.Plugin.GetNode:output_type -> gosdn.plugin.GetNodeResponse + 7, // 23: gosdn.plugin.Plugin.DeleteNode:output_type -> gosdn.plugin.DeleteNodeResponse + 9, // 24: gosdn.plugin.Plugin.Model:output_type -> gosdn.plugin.ModelResponse + 11, // 25: gosdn.plugin.Plugin.Diff:output_type -> gosdn.plugin.DiffResponse + 17, // 26: gosdn.plugin.Plugin.SchemaTreeGzip:output_type -> gosdn.plugin.Payload + 13, // 27: gosdn.plugin.Plugin.ValidateChange:output_type -> gosdn.plugin.ValidateChangeResponse + 15, // 28: gosdn.plugin.Plugin.PruneConfigFalse:output_type -> gosdn.plugin.PruneConfigFalseResponse + 20, // [20:29] is the sub-list for method output_type + 11, // [11:20] is the sub-list for method input_type 11, // [11:11] is the sub-list for extension type_name 11, // [11:11] is the sub-list for extension extendee 0, // [0:11] is the sub-list for field type_name @@ -1157,7 +1099,7 @@ func file_gosdn_plugin_plugin_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_gosdn_plugin_plugin_proto_rawDesc), len(file_gosdn_plugin_plugin_proto_rawDesc)), NumEnums: 0, - NumMessages: 19, + NumMessages: 18, NumExtensions: 0, NumServices: 1, }, diff --git a/api/go/gosdn/plugin/plugin.pb.gw.go b/api/go/gosdn/plugin/plugin.pb.gw.go deleted file mode 100644 index 745f6cadd..000000000 --- a/api/go/gosdn/plugin/plugin.pb.gw.go +++ /dev/null @@ -1,162 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: gosdn/plugin/plugin.proto - -/* -Package plugin is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package plugin - -import ( - "context" - "errors" - "io" - "net/http" - - "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" - "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" -) - -// Suppress "imported and not used" errors -var ( - _ codes.Code - _ io.Reader - _ status.Status - _ = errors.New - _ = runtime.String - _ = utilities.NewDoubleArray - _ = metadata.Join -) - -var filter_Plugin_GetAvailablePlugins_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} - -func request_Plugin_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, client PluginClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq GetAvailablePluginsRequest - metadata runtime.ServerMetadata - ) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Plugin_GetAvailablePlugins_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.GetAvailablePlugins(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err -} - -func local_request_Plugin_GetAvailablePlugins_0(ctx context.Context, marshaler runtime.Marshaler, server PluginServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var ( - protoReq GetAvailablePluginsRequest - metadata runtime.ServerMetadata - ) - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Plugin_GetAvailablePlugins_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.GetAvailablePlugins(ctx, &protoReq) - return msg, metadata, err -} - -// RegisterPluginHandlerServer registers the http handlers for service Plugin to "mux". -// UnaryRPC :call PluginServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPluginHandlerFromEndpoint instead. -// GRPC interceptors will not work for this type of registration. To use interceptors, you must use the "runtime.WithMiddlewares" option in the "runtime.NewServeMux" call. -func RegisterPluginHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PluginServer) error { - mux.Handle(http.MethodGet, pattern_Plugin_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.plugin.Plugin/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins/plugin")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Plugin_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Plugin_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - - return nil -} - -// RegisterPluginHandlerFromEndpoint is same as RegisterPluginHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterPluginHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.NewClient(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - return RegisterPluginHandler(ctx, mux, conn) -} - -// RegisterPluginHandler registers the http handlers for service Plugin to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterPluginHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterPluginHandlerClient(ctx, mux, NewPluginClient(conn)) -} - -// RegisterPluginHandlerClient registers the http handlers for service Plugin -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PluginClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PluginClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "PluginClient" to call the correct interceptors. This client ignores the HTTP middlewares. -func RegisterPluginHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PluginClient) error { - mux.Handle(http.MethodGet, pattern_Plugin_GetAvailablePlugins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.plugin.Plugin/GetAvailablePlugins", runtime.WithHTTPPathPattern("/plugins/plugin")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Plugin_GetAvailablePlugins_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - forward_Plugin_GetAvailablePlugins_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - }) - return nil -} - -var ( - pattern_Plugin_GetAvailablePlugins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"plugins", "plugin"}, "")) -) - -var ( - forward_Plugin_GetAvailablePlugins_0 = runtime.ForwardResponseMessage -) diff --git a/api/go/gosdn/plugin/plugin_grpc.pb.go b/api/go/gosdn/plugin/plugin_grpc.pb.go index ec194d82d..e524b8c4b 100644 --- a/api/go/gosdn/plugin/plugin_grpc.pb.go +++ b/api/go/gosdn/plugin/plugin_grpc.pb.go @@ -7,7 +7,6 @@ package plugin import ( - plugin_registry "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry" context "context" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -20,16 +19,15 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Plugin_Unmarshal_FullMethodName = "/gosdn.plugin.Plugin/Unmarshal" - Plugin_SetNode_FullMethodName = "/gosdn.plugin.Plugin/SetNode" - Plugin_GetNode_FullMethodName = "/gosdn.plugin.Plugin/GetNode" - Plugin_DeleteNode_FullMethodName = "/gosdn.plugin.Plugin/DeleteNode" - Plugin_Model_FullMethodName = "/gosdn.plugin.Plugin/Model" - Plugin_Diff_FullMethodName = "/gosdn.plugin.Plugin/Diff" - Plugin_SchemaTreeGzip_FullMethodName = "/gosdn.plugin.Plugin/SchemaTreeGzip" - Plugin_ValidateChange_FullMethodName = "/gosdn.plugin.Plugin/ValidateChange" - Plugin_PruneConfigFalse_FullMethodName = "/gosdn.plugin.Plugin/PruneConfigFalse" - Plugin_GetAvailablePlugins_FullMethodName = "/gosdn.plugin.Plugin/GetAvailablePlugins" + Plugin_Unmarshal_FullMethodName = "/gosdn.plugin.Plugin/Unmarshal" + Plugin_SetNode_FullMethodName = "/gosdn.plugin.Plugin/SetNode" + Plugin_GetNode_FullMethodName = "/gosdn.plugin.Plugin/GetNode" + Plugin_DeleteNode_FullMethodName = "/gosdn.plugin.Plugin/DeleteNode" + Plugin_Model_FullMethodName = "/gosdn.plugin.Plugin/Model" + Plugin_Diff_FullMethodName = "/gosdn.plugin.Plugin/Diff" + Plugin_SchemaTreeGzip_FullMethodName = "/gosdn.plugin.Plugin/SchemaTreeGzip" + Plugin_ValidateChange_FullMethodName = "/gosdn.plugin.Plugin/ValidateChange" + Plugin_PruneConfigFalse_FullMethodName = "/gosdn.plugin.Plugin/PruneConfigFalse" ) // PluginClient is the client API for Plugin service. @@ -45,7 +43,6 @@ type PluginClient interface { SchemaTreeGzip(ctx context.Context, in *SchemaTreeGzipRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[Payload], error) ValidateChange(ctx context.Context, in *ValidateChangeRequest, opts ...grpc.CallOption) (*ValidateChangeResponse, error) PruneConfigFalse(ctx context.Context, in *PruneConfigFalseRequest, opts ...grpc.CallOption) (*PruneConfigFalseResponse, error) - GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) } type pluginClient struct { @@ -155,16 +152,6 @@ func (c *pluginClient) PruneConfigFalse(ctx context.Context, in *PruneConfigFals return out, nil } -func (c *pluginClient) GetAvailablePlugins(ctx context.Context, in *GetAvailablePluginsRequest, opts ...grpc.CallOption) (*plugin_registry.GetResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(plugin_registry.GetResponse) - err := c.cc.Invoke(ctx, Plugin_GetAvailablePlugins_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - // PluginServer is the server API for Plugin service. // All implementations must embed UnimplementedPluginServer // for forward compatibility. @@ -178,7 +165,6 @@ type PluginServer interface { SchemaTreeGzip(*SchemaTreeGzipRequest, grpc.ServerStreamingServer[Payload]) error ValidateChange(context.Context, *ValidateChangeRequest) (*ValidateChangeResponse, error) PruneConfigFalse(context.Context, *PruneConfigFalseRequest) (*PruneConfigFalseResponse, error) - GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) mustEmbedUnimplementedPluginServer() } @@ -216,9 +202,6 @@ func (UnimplementedPluginServer) ValidateChange(context.Context, *ValidateChange func (UnimplementedPluginServer) PruneConfigFalse(context.Context, *PruneConfigFalseRequest) (*PruneConfigFalseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PruneConfigFalse not implemented") } -func (UnimplementedPluginServer) GetAvailablePlugins(context.Context, *GetAvailablePluginsRequest) (*plugin_registry.GetResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAvailablePlugins not implemented") -} func (UnimplementedPluginServer) mustEmbedUnimplementedPluginServer() {} func (UnimplementedPluginServer) testEmbeddedByValue() {} @@ -395,24 +378,6 @@ func _Plugin_PruneConfigFalse_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Plugin_GetAvailablePlugins_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAvailablePluginsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(PluginServer).GetAvailablePlugins(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Plugin_GetAvailablePlugins_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(PluginServer).GetAvailablePlugins(ctx, req.(*GetAvailablePluginsRequest)) - } - return interceptor(ctx, in, info, handler) -} - // Plugin_ServiceDesc is the grpc.ServiceDesc for Plugin service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -452,10 +417,6 @@ var Plugin_ServiceDesc = grpc.ServiceDesc{ MethodName: "PruneConfigFalse", Handler: _Plugin_PruneConfigFalse_Handler, }, - { - MethodName: "GetAvailablePlugins", - Handler: _Plugin_GetAvailablePlugins_Handler, - }, }, Streams: []grpc.StreamDesc{ { diff --git a/api/proto/gosdn/plugin-registry/plugin-registry.proto b/api/proto/gosdn/plugin-registry/plugin-registry.proto index 1210ab99c..c8f99c581 100644 --- a/api/proto/gosdn/plugin-registry/plugin-registry.proto +++ b/api/proto/gosdn/plugin-registry/plugin-registry.proto @@ -4,7 +4,6 @@ package gosdn.plugin_registry; import "google/protobuf/timestamp.proto"; import "buf/validate/validate.proto"; -import "google/api/annotations.proto"; option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"; @@ -66,12 +65,3 @@ message Manifest { string author = 3; string version = 4; } - -message GetAvailablePluginsResponse { - int64 timestamp = 1; // Timestamp in nanoseconds since Epoch. - repeated gosdn.plugin_registry.Plugin plugins = 2; -} - -message GetAvailablePluginsRequest { - int64 timestamp = 1; -} \ No newline at end of file diff --git a/api/proto/gosdn/plugin/plugin.proto b/api/proto/gosdn/plugin/plugin.proto index 6d7ca8447..0fdf94e80 100644 --- a/api/proto/gosdn/plugin/plugin.proto +++ b/api/proto/gosdn/plugin/plugin.proto @@ -23,7 +23,6 @@ service Plugin { rpc SchemaTreeGzip(SchemaTreeGzipRequest) returns (stream Payload); rpc ValidateChange(ValidateChangeRequest) returns (ValidateChangeResponse); rpc PruneConfigFalse(PruneConfigFalseRequest) returns (PruneConfigFalseResponse); - rpc GetAvailablePlugins(GetAvailablePluginsRequest) returns (gosdn.plugin_registry.GetResponse); } message UnmarshalRequest { @@ -103,7 +102,3 @@ message SchemaTreeGzipRequest { message Payload { bytes chunk = 1; } - -message GetAvailablePluginsRequest { - int64 timestamp = 1; - } \ No newline at end of file diff --git a/controller/controller.go b/controller/controller.go index 3b339bd52..a1a24aaf6 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -346,10 +346,8 @@ func ensureAdminRoleExists() error { "/gosdn.networkelement.NetworkElementService/DeviceSchema", "/gosdn.networkelement.NetworkElementService/Delete", "/gosdn.networkelement.NetworkElementService/SubscribePath", - "/gosdn.networkelement.NetworkElementService/ParseYang", "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins", "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema", - "/gosdn.plugin_internal.PluginInternalService/GetAvailablePlugins", "/gosdn.app.AppService/Register", "/gosdn.app.AppService/Deregister", "/gosdn.configurationmanagement.ConfigurationManagementService/ExportSDNConfig", diff --git a/controller/http.go b/controller/http.go index 684b8f83f..394b7a0b0 100644 --- a/controller/http.go +++ b/controller/http.go @@ -16,7 +16,6 @@ import ( "google.golang.org/grpc/status" mnegw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" - plg "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-internal" pgw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" agw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac" tgw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology" @@ -86,11 +85,6 @@ func setupHttpServer() error { return err } - err = plg.RegisterPluginInternalServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts) - if err != nil { - return err - } - // Set the HTTP server of core to the new server c.httpServer = &http.Server{Addr: ":8080", Handler: mux, diff --git a/react-ui/src/components/devices/routines/plugin.routine.ts b/react-ui/src/components/devices/routines/plugin.routine.ts index ece4608f7..91acc0fef 100644 --- a/react-ui/src/components/devices/routines/plugin.routine.ts +++ b/react-ui/src/components/devices/routines/plugin.routine.ts @@ -1,4 +1,4 @@ -import { PluginInternalServiceGetAvailablePluginsApiArg, api } from "@api/api" +import { api, PluginInternalServiceAvailablePluginsApiArg } from "@api/api" import { warnMessage } from "@helper/debug" import { createAsyncThunk } from "@reduxjs/toolkit" import { RootState } from "src/stores" @@ -17,12 +17,12 @@ export const fetchPluginsThunk = createAsyncThunk( return } - const payload: PluginInternalServiceGetAvailablePluginsApiArg = { + const payload: PluginInternalServiceAvailablePluginsApiArg = { timestamp: new Date().getTime().toString(), } - const plugins = await thunkApi.dispatch(api.endpoints.pluginInternalServiceGetAvailablePlugins.initiate(payload)) + const plugins = await thunkApi.dispatch(api.endpoints.pluginInternalServiceAvailablePlugins.initiate(payload)) if (plugins.error || !plugins.data?.plugins) { warnMessage('Plugin fetch returned an error: ' + plugins.error) diff --git a/react-ui/src/shared/api/api.ts b/react-ui/src/shared/api/api.ts index c223fa2cf..2b9439b96 100755 --- a/react-ui/src/shared/api/api.ts +++ b/react-ui/src/shared/api/api.ts @@ -212,9 +212,9 @@ const injectedRtkApi = api }), invalidatesTags: ['NetworkElementService'], }), - pluginInternalServiceGetAvailablePlugins: build.query< - PluginInternalServiceGetAvailablePluginsApiResponse, - PluginInternalServiceGetAvailablePluginsApiArg + pluginInternalServiceAvailablePlugins: build.query< + PluginInternalServiceAvailablePluginsApiResponse, + PluginInternalServiceAvailablePluginsApiArg >({ query: queryArg => ({ url: `/plugins`, @@ -564,19 +564,6 @@ const injectedRtkApi = api }), invalidatesTags: ['UserService'], }), - networkElementServiceParseYang: build.query< - NetworkElementServiceParseYangApiResponse, - NetworkElementServiceParseYangApiArg - >({ - query: queryArg => ({ - url: `/yang/parse`, - params: { - timestamp: queryArg.timestamp, - yang: queryArg.yang, - }, - }), - providesTags: ['NetworkElementService'], - }), }), overrideExisting: false, }) @@ -686,9 +673,9 @@ export type NetworkElementServiceUpdateApiResponse = export type NetworkElementServiceUpdateApiArg = { networkelementUpdateNetworkElementRequest: TodoChangeNameToFitTheRest } -export type PluginInternalServiceGetAvailablePluginsApiResponse = +export type PluginInternalServiceAvailablePluginsApiResponse = /** status 200 A successful response. */ GosdnpluginRegistryGetResponse -export type PluginInternalServiceGetAvailablePluginsApiArg = { +export type PluginInternalServiceAvailablePluginsApiArg = { timestamp?: string } export type PndServiceGetPndApiResponse = /** status 200 A successful response. */ PndGetPndResponse @@ -849,13 +836,6 @@ export type UserServiceUpdateUsersApiResponse = export type UserServiceUpdateUsersApiArg = { rbacUpdateUsersRequest: UpdateUsers } -export type NetworkElementServiceParseYangApiResponse = - /** status 200 A successful response. */ NetworkelementParseYangResponse -export type NetworkElementServiceParseYangApiArg = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - yang?: string -} export type AppAppDeregisterResponse = { timestamp?: string } @@ -1424,11 +1404,6 @@ export type UpdateUsers = { timestamp?: string user?: RbacUpdateUser[] } -export type NetworkelementParseYangResponse = { - /** Timestamp in nanoseconds since Epoch. */ - timestamp?: string - json?: string -} export const { useAppServiceDeregisterMutation, useConfigurationManagementServiceExportSdnConfigQuery, @@ -1446,7 +1421,7 @@ export const { useNetworkElementServiceGetIntendedPathQuery, useNetworkElementServiceGetPathQuery, useNetworkElementServiceUpdateMutation, - usePluginInternalServiceGetAvailablePluginsQuery, + usePluginInternalServiceAvailablePluginsQuery, usePndServiceGetPndQuery, usePndServiceGetPndListQuery, usePndServiceCreatePndListMutation, @@ -1475,5 +1450,4 @@ export const { useUserServiceDeleteUsersMutation, useUserServiceGetUserQuery, useUserServiceUpdateUsersMutation, - useNetworkElementServiceParseYangQuery, } = injectedRtkApi -- GitLab From dc1f4a84b6de9a41bed55bf9d1e086f80e1f73ae Mon Sep 17 00:00:00 2001 From: Matthias Feyll <matthias.feyll@stud.h-da.de> Date: Thu, 6 Mar 2025 13:47:56 +0100 Subject: [PATCH 78/78] remove unecessary imports --- api/go/gosdn/plugin/plugin.pb.go | 253 ++++++++++++++-------------- api/proto/gosdn/plugin/plugin.proto | 2 - 2 files changed, 123 insertions(+), 132 deletions(-) diff --git a/api/go/gosdn/plugin/plugin.pb.go b/api/go/gosdn/plugin/plugin.pb.go index 57f3307c3..0a66a1963 100644 --- a/api/go/gosdn/plugin/plugin.pb.go +++ b/api/go/gosdn/plugin/plugin.pb.go @@ -9,9 +9,7 @@ package plugin import ( _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" networkelement "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" - _ "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry" gnmi "github.com/openconfig/gnmi/proto/gnmi" - _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -876,142 +874,137 @@ var file_gosdn_plugin_plugin_proto_rawDesc = string([]byte{ 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x2b, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7e, - 0x0a, 0x10, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, - 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x29, - 0x0a, 0x11, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x68, 0x0a, 0x0e, 0x53, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x7e, 0x0a, 0x10, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x27, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x7a, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, - 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x40, 0x0a, 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, - 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, - 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, - 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x22, 0x2a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x6c, 0x75, 0x65, 0x22, 0x29, 0x0a, 0x11, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x3e, - 0x0a, 0x0c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, - 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x23, - 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x6a, - 0x73, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x08, 0x6f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0x46, 0x0a, 0x0c, 0x44, 0x69, - 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0xb9, 0x01, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x09, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x09, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, - 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2e, - 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x68, + 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, + 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x27, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x22, 0x7a, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, + 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x40, 0x0a, 0x17, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3b, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x28, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x11, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x26, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x0c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, + 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4f, + 0x6e, 0x6c, 0x79, 0x22, 0x23, 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x44, 0x69, 0x66, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, + 0x01, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x08, 0x6d, + 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, + 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, + 0x46, 0x0a, 0x0c, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x01, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x48, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x69, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x6e, 0x6d, 0x69, + 0x2e, 0x50, 0x61, 0x74, 0x68, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x2e, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, + 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x30, 0x0a, 0x18, + 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x37, - 0x0a, 0x17, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x30, 0x0a, 0x18, 0x50, 0x72, 0x75, 0x6e, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x1f, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x32, 0xc8, 0x05, 0x0a, 0x06, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x4c, - 0x0a, 0x09, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x12, 0x1e, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, - 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, - 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, - 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x6f, - 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, - 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3d, 0x0a, 0x04, 0x44, 0x69, 0x66, 0x66, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, - 0x0a, 0x0e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, - 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x12, 0x5b, - 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x17, + 0x0a, 0x15, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, 0x7a, 0x69, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1f, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x32, 0xc8, 0x05, 0x0a, 0x06, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x12, 0x4c, 0x0a, 0x09, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, + 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, + 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x40, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1a, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x44, 0x69, 0x66, 0x66, 0x12, 0x19, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, + 0x65, 0x47, 0x7a, 0x69, 0x70, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x72, 0x65, 0x65, 0x47, + 0x7a, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x50, - 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x12, - 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, - 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x32, - 0x5a, 0x30, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, - 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x61, 0x0a, 0x10, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, + 0x61, 0x6c, 0x73, 0x65, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, + 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2e, 0x50, 0x72, 0x75, 0x6e, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x42, 0x32, 0x5a, 0x30, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, + 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) var ( diff --git a/api/proto/gosdn/plugin/plugin.proto b/api/proto/gosdn/plugin/plugin.proto index 0fdf94e80..0b443abf3 100644 --- a/api/proto/gosdn/plugin/plugin.proto +++ b/api/proto/gosdn/plugin/plugin.proto @@ -4,11 +4,9 @@ package gosdn.plugin; import "github.com/openconfig/gnmi/proto/gnmi/gnmi.proto"; import "buf/validate/validate.proto"; -import "google/api/annotations.proto"; import "gosdn/networkelement/networkelement.proto"; -import "gosdn/plugin-registry/plugin-registry.proto"; option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin"; -- GitLab